fclose()导致窗口崩溃

时间:2013-07-03 13:53:55

标签: c

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

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

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

编辑: “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操作。这似乎是因为问题已经消失。

4 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:1)

 fileName = malloc(sizeof(char)*17)

是一个简短的字符(忘记'\ 0'?)。也许这就是全部

答案 2 :(得分:0)

你要分配2个字符(比如说2个字节)

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

然后用'0'填充第一个

    number[0] = '0';

然后尝试再添加两个字符。最后一个null将溢出您分配的存储空间。在这个poing你是在借来的时间,谁知道会发生什么。如果你已经破坏了近距离使用的东西,它可能会在那里打破。

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

这里也是。

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

尝试为null终止分配至少3个字符,并使用像snprintf这样的已检查字符串副本,它将始终为null终止并且不会从数组中删除。

始终检查返回代码。

答案 3 :(得分:0)

抱歉,不知道这里有什么用处。我没有更多的进展来调查究竟是什么导致了崩溃或fclose返回了什么,但似乎在代码中的某处有一个不需要的fopen操作。由于某种原因,这似乎是罪魁祸首,因为问题现在已经消失。 谢谢大家的帮助