我编写了一个C程序,在其中我将结果记录到一个文件中。有一个无限的while循环——这是一个要求。要调试代码,我需要查看日志文件,但由于程序正在运行,我看不到任何写入的内容。使用ctrl+C强制关闭程序也没有帮助。我没看到文件上写什么。
我使用简单的fopen和fprintf函数在写入模式下读取文件并写入。
FILE *fp = fopen("filename.txt", "w");
fprintf(fp, "this wants itself to be written the moment this statement is executedn");
附言:代码中没有错误。如果我在while循环中设置了一个终止条件,并且程序正常退出,我会看到日志文件中写的内容。
打印到控制台和打印到文件的区别在于,流在连接到控制台时默认为行缓冲,但在连接到文件时为块缓冲。将您的代码更改为:
FILE *fp = fopen("filename.txt", "w");
setvbuf(fp,0,_IOLBF,0);
fprintf(fp, "this wants itself to be written the moment this statement is executedn");
并且即使流附加到文件,您的输出也将被行缓冲。你也可以做无缓冲流。
[编辑:]
参考C11 7.21.5.6:
简介
#include <stdio.h>
int setvbuf(FILE * restrict stream,
char * restrict buf,
int mode, size_t size);
说明
setvbuf函数只能在流已与打开的文件关联,并且在任何其他文件之前对执行操作(对setvbuf的调用不成功除外)溪流。自变量模式确定流将如何被缓冲,如下:_IOFBF使得输入/输出被完全缓冲_IOLBF使得输入/输出被行缓冲_IONBF使输入/输出没有缓冲。如果buf不是空指针,那么它所指向的数组可以使用,而不是由setvbuf函数分配的缓冲区参数大小指定数组的大小;否则,大小可以确定由setvbuf函数分配的缓冲器的大小。数组的内容在任何时候都是不确定的。
返回
setvbuf函数在成功时返回零,如果无效则返回非零值是为模式或无法满足请求而给定的。
你应该看到函数fopen(),如果你用"w"模式打开一个文件,这意味着如果这个文件存在,清除这个文件,然后写。我认为最后应该使用"a+"模式来附加数据。