由于某种原因, fclose() 似乎在我正在编写的程序中导致错误。当它发生时,Windows 终端会显示“进程返回 255”。以下是部分代码:
FILE* output = fopen("random.txt","w");
write(c,output);
//fprintf(output,"shit\n");
fclose(output);
“写”基本上将内容写入输出文件。即使程序崩溃,数据也会输出到文件中。写入操作后,我仍然可以写入输出文件,如果我这样做,文本将在那里,但以某种方式关闭文件会导致错误。有人可以向我解释错误代码可能意味着什么(如果有的话),以及如何解决这个错误?谢谢你。
编辑:“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 C 附带的。它以前做过一些不靠谱的事情,难道错不在我身上吗?
编辑:也许我应该通过问来浓缩这个问题:在什么情况下,fprintf 可以完美地在一个打开的文件上工作,而不是 fclose,它在它甚至可以生成返回值之前就崩溃了?
编辑:谢谢,伙计们,所有的帮助和建议;我发现我在代码的某处有一个不需要的 fopen 操作。似乎就是这样,因为问题已经消失了。