Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如果在同一执行过程中写入和读取文件,程序将挂起_C_Fopen_Fwrite - Fatal编程技术网

C 如果在同一执行过程中写入和读取文件,程序将挂起

C 如果在同一执行过程中写入和读取文件,程序将挂起,c,fopen,fwrite,C,Fopen,Fwrite,我希望下面的代码将数字42写入一个二进制文件,然后读取并打印出确切的值。它会这样做,但不会退出,就像等待用户输入时一样暂停。下面是我解释过的代码: #include <stdio.h> #include <stdlib.h> int main(int argc, char argv[]){ char *filename = "test.db"; int *my_int = calloc(1, sizeof(int)); *my_int = 42

我希望下面的代码将数字42写入一个二进制文件,然后读取并打印出确切的值。它会这样做,但不会退出,就像等待用户输入时一样暂停。下面是我解释过的代码:

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char argv[]){

    char *filename = "test.db";
    int *my_int = calloc(1, sizeof(int));
    *my_int = 42;

    // First we open file to write to it
    FILE *file = fopen(filename, "w");
    fwrite(my_int, sizeof(int), 1, file);
    fflush(file);
    free(file);

    // Then we want to read from it
    *my_int = -1;
    file = fopen(filename, "r");
    fread(my_int, sizeof(int), 1, file);
    free(file);

    printf("Read back %d\n", *my_int);

    return 0;
}
#包括
#包括
int main(int argc,char argv[]{
char*filename=“test.db”;
int*my_int=calloc(1,sizeof(int));
*my_int=42;
//首先,我们打开文件写入它
FILE*FILE=fopen(文件名,“w”);
fwrite(my_int,sizeof(int),1,file);
fflush(文件);
免费(文件);
//然后我们想从中读一读
*my_int=-1;
file=fopen(文件名为“r”);
fread(my_int,sizeof(int),1,file);
免费(文件);
printf(“读回%d\n”,*my\u int);
返回0;
}

我知道我可以简单地用
w+
标志打开它,但我只是好奇地想弄清楚它为什么会暂停。

如果你不
释放文件指针,你就
丢失它。对使用
fopen
打开的文件调用
free()
是未定义的行为

我相信如果您将
免费(文件)
行替换为
fclose(文件)
,您的问题将得到解决


如果您只在该函数中使用
calloc
,我还建议您不要为
my_int
分配内存。最好将该内存放在堆栈上,即
intmy\u int
而不是
int*my\u int=calloc(sizeof(int))
。后者要求您稍后在程序中调用
free()
,而前者则不需要。

用于关闭文件

fclose(file);
此外,参考资料说:

与流关联的所有内部缓冲区都与 它冲了起来:

所以

在这里可以避免

用于释放指针的保留内存。就你而言

free(my_int); 

如果放在
返回

免费(文件)之前,将有意义-未定义的行为当您立即覆盖放置在那里的
0
s时,为什么要使用
calloc
分配
my_int
?如果您打算在阅读之前自己初始化它,那么使用
malloc()
可能会更有效。我已经按照您的建议完成了这项工作。谢谢你的帮助。
free(my_int);