提问者:小点点

fclose()导致窗口崩溃


出于某种原因,foff()似乎在我正在编写的程序中导致错误。Windows终端在发生时显示“进程返回255”。下面是部分代码:

FILE* output = fopen("random.txt","w");
write(c,output);
//fprintf(output,"shit\n");
fclose(output);

“write”基本上将内容写入输出文件。即使程序崩溃,数据也会输出到文件中。写入操作后,我仍然可以写入输出文件,如果我这样做,文本会在那里,但不知何故关闭文件会导致错误。有人能向我解释错误代码可能意味着什么(如果有的话),以及如何解决这个错误吗?谢谢。

编辑:“write()”写入输出文件,仅此而已;它对输出文件所做的唯一事情是fprintf-ing。它什么也不返回,因为它是一个void函数。没有看到foff()返回什么,因为显然程序在我检查返回值之前就崩溃了:\

编辑:下面是“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);

}

编辑:我修复了所有的字符串问题,错误仍然存在。顺便说一句,如果我在write eSentence函数中声明文件指针,而不是事先打开文件传入它,并在函数停止之前关闭它,不知何故,一切都很好。顺便说一句,编译器是Pelles C自带的。它以前做过一些不稳定的事情,所以可能不是我的错吗?

编辑:也许我应该通过问来简化这个问题:在什么情况下,fprintf可以在打开以供写入的文件上完美工作,但不能在生成返回值之前崩溃?

编辑:谢谢各位的帮助和建议;我发现我在代码中的某个地方有一个不需要的fopen操作。似乎就是这样,因为问题已经解决了。


共3个答案

匿名用户

foff本身很可能没问题。问题可能是您的代码中其他地方有未定义的行为,这导致程序稍后崩溃。崩溃恰好发生在调用foff的过程中。我可以看到未定义行为的一个例子是:

fileName = malloc(sizeof(char)*17);
strcpy(fileName,"res/SEN/  /  .txt");

这会将18个字节(包括空终止符)写入分配的17个字节。写入number时也会出现类似的缓冲区溢出。当然,代码中的其他地方也可能存在未定义行为的其他实例,包括您尚未展示的函数。尝试查找问题的一种可能方法是禁用代码部分,看看它是否仍然崩溃。

匿名用户

 fileName = malloc(sizeof(char)*17)

正好是一个字符(忘记了'\0'?)。也许这就是全部

匿名用户

您正在分配2个字符(例如2个字节)

char* number = malloc(sizeof(char)*2);
if (c->subtype < 10){

然后用“0”填充第一个

    number[0] = '0';

然后尝试再放入两个字符。最后一个null将溢出您分配的存储空间。此时,您的时间很短,谁知道会发生什么。如果您损坏了近距离使用的东西,它可能会在那里损坏。

    sprintf(number+1,"%d\0",c->subtype);
}else{

这里也是。

    sprintf(number,"%d\0",c->subtype);
}

尝试为空终止分配至少3个字符,并使用检查的字符串副本,如snprintf,它将始终为空终止并且不会离开您的数组。

始终检查返回码。