Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.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_Windows - Fatal编程技术网

c语言中的文件写入问题

c语言中的文件写入问题,c,windows,C,Windows,我正在c应用程序中写入日志文件,写入文件的方法是 fopen_s(&fMainFile, "c:\\LOG\\Filter.txt", "a"); fprintf(fMainFile, "SomeText"); fclose(fMainFile); 我打开了句柄,写了之后我关闭了它,但是写了一段时间后我的应用程序崩溃了,有人能解决这个问题吗,一次又一次地打开和关闭句柄有多危险,或者提出了任何其他写文件的方法。fMainFile是如何定义的?我想你应该: fopen_s(&fMa

我正在c应用程序中写入日志文件,写入文件的方法是

fopen_s(&fMainFile, "c:\\LOG\\Filter.txt", "a");
fprintf(fMainFile, "SomeText");
fclose(fMainFile);

我打开了句柄,写了之后我关闭了它,但是写了一段时间后我的应用程序崩溃了,有人能解决这个问题吗,一次又一次地打开和关闭句柄有多危险,或者提出了任何其他写文件的方法。

fMainFile是如何定义的?我想你应该:

fopen_s(&fMainFile, "c:\\LOG\\Filter.txt", "a");
fprintf(&fMainFile, "SomeText");
fclose(&fMainFile);
传递对fprintf/fclose函数的引用,就像使用fopen_s一样

编辑:此答案无效,因为fopen_s采用下面注释中所述的文件**参数


EDIT2:正如我在评论中所说的,您应该进行缓冲写入(使用您自己的缓冲区或对文件使用setvbuf()函数)。另外,不要每次都重新打开/关闭文件,而是让它保持打开状态,只有在确实需要时(输入完成)才关闭它。使用fflush()强制写入磁盘(而不是fclose())。

您肯定应该在代码中添加一些错误检查,请参阅以获取特定的fopen示例。也许你可以通过这种方式获得更多的信息。除此之外,您的代码片段看起来是正确的。

您必须检查fopen_s的返回值,并且只有在成功时才调用fprintf和fclose

if (fopen_s(&fMainFile, "c:\\LOG\\Filter.txt", "a") == 0)
{
  fprintf(fMainFile, "SomeText");
  fclose(fMainFile);
}

一个明显的问题是,您没有进行任何错误检查-这是对
fopen_s
调用的强制性要求。我已经应用了错误检查代码,但它对我没有帮助。事实上,我正在编写大量数据,5秒内几乎100行,它写了一些数据,但过了一段时间它就崩溃了。@Arman:真的有必要在每次写的时候打开和关闭文件吗?你为什么要这么做?@Greg,如果我不关上把手,对悬挂着的记忆有多危险。或者我使用的方法是危险的。请给我解释一下.FILE*fMainFile;我把它定义为全局的。它看起来像是
fopen\u s
takes
FILE**
fclose
takes
FILE*
我知道了,我没想到。放弃这个答案,那么错误一定在其他地方。也许如果你发布更多的代码,我们就能找到它。我有一个从网络接收数据并写入日志文件的应用程序。数据输入的速率几乎是每5秒100个数据包,每个数据包的最大大小是400字节。然后我建议缓冲输入并写入更大的数据块,比如说16kB。还有,为什么每次都要关闭文件?让它保持打开状态,并在所有书写完成后关闭它。可以使用fflush()强制写入磁盘。