由于某种原因,fclose()似乎在我正在编写的程序中导致错误。当发生这种情况时,windows终端会显示“进程返回255”。下面是代码的一部分:
FILE* output = fopen("random.txt","w");
write(c,output);
//fprintf(output,"shit\n");
fclose(output);"write“基本上是将内容写入到输出文件中。即使程序崩溃,数据也会输出到文件中。在写操作之后,我仍然可以写到输出文件,如果我这样做了,文本将在那里,但不知何故关闭文件会导致错误。谁能给我解释一下错误代码的含义(如果有的话),以及如何解决这个错误?谢谢。
EDIT:"write()“写入输出文件,仅此而已;它对输出文件所做的唯一事情就是fprintf-ing。它不返回任何内容,因为它是一个void函数。我没有看到fclose()返回了什么,因为程序显然在我检查返回值之前就崩溃了:\
编辑:下面是"write()“的细节。我将其更改为"write_insult()“,以避免与系统调用混淆。
void write_insult(Composite c,FILE* output){
printf("lol\n");
switch (c->type){
case SENTENCE:{
writeSentence(c,output);
break;
}
default: break;
}}
void writeSentence(Composite c,FILE* output){
FILE* source;
int random = 0;
char* fileName = NULL;
int i = 0;
char* number = malloc(sizeof(char)*2);
if (c->subtype < 10){
number[0] = '0';
sprintf(number+1,"%d\0",c->subtype);
}else{
sprintf(number,"%d\0",c->subtype);
}
fileName = malloc(sizeof(char)*17);
strcpy(fileName,"res/SEN/ / .txt");
fileName[8] = number[0];
fileName[9] = number[1];
fileName[11] = '0';
fileName[12] = '0';
FILE* tester = NULL;
while ((tester = fopen(fileName,"r")) != NULL){
i++;
fclose(tester);
if (i < 10){
fileName[12]++;
}else{
fileName[11]++;
fileName[12] = '0';
i = 0;
}
}
random = rand()%i;
if (random < 10){
number[0] = '0';
sprintf(number+1,"%d\0",random);
}else{
sprintf(number,"%d\0",random);
}
fileName[11] = number[0];
fileName[12] = number[1];
fileName[17] = 0;
source = fopen(fileName,"r");
Table t = parseFile(source); //remember to free
i = 0;
char* word = NULL;
while (i < t->num){
if (isInt(t->content[i])){
word = chooseWord(atoi(t->content[i]));
}else{
word = t->content[i];
}
fprintf(output,"%s ",word);
i++;
}
fclose(source);
destroyTable(t);}
编辑:我修复了所有的字符串问题,错误仍然存在。顺便说一句,如果我在writeSentence函数中声明文件指针,而不是事先打开传入的文件,并在函数停止之前关闭它,不知何故,一切都很好。顺便说一句,这个编译器是Pelles附带的。它之前做了一些不可靠的事情,所以会不会不是我的错呢?
编辑:也许我应该通过问这个问题来压缩这个问题:在什么情况下,fprintf可以在打开用于写入的文件上完美工作,而不是fclose,它甚至在生成返回值之前就崩溃了?
编辑:谢谢大家的帮助和建议;我发现代码中的某个地方有一个不想要的fopen操作。似乎就是这样,因为问题已经消失了。
发布于 2013-07-15 19:05:14
抱歉,我不知道这里是怎么运作的。我没有更多的进展来调查到底是什么导致了崩溃,或者fclose返回了什么,但似乎在代码中的某个地方有一个不想要的fopen操作。出于某种原因,这似乎是罪魁祸首,因为问题现在已经消失了。感谢大家的帮助
发布于 2013-07-03 22:22:28
fclose本身很可能没问题。问题可能是您的代码中的其他地方有未定义的行为,这会导致程序稍后崩溃。崩溃恰好发生在调用fclose的过程中。我能看到的未定义行为的一个例子是:
fileName = malloc(sizeof(char)*17);
strcpy(fileName,"res/SEN/ / .txt");这会将18个字节(包括空终止符)写入分配的17个字节。写入number时也存在类似的缓冲区溢出。当然,在代码中的其他地方也可能存在未定义行为的其他实例,包括您没有显示的函数。尝试发现问题的一种可能方法是禁用代码部分,看看它是否仍然崩溃。
发布于 2013-07-03 22:24:03
fileName = malloc(sizeof(char)*17)正好少了一个字符(忘记了'\0'?)。也许这就是全部
https://stackoverflow.com/questions/17449917
复制相似问题