在调试模式下将输出重定向到文件的问题是,在程序完成之前,我无法查看文件内容(大小为零)。有了这个用法:
FILE *f;
f = fopen("log.txt", "w");
fprintf(f, "cycle =%d\n", c);
在调试时,我想在单步执行“fprintf”语句后立即查看文件中的“cycle =”。
有没有办法做到这一点?
答案 0 :(得分:2)
虽然我在C99中没有看到它,但setlinebuf()是一个在任何需要的CI中都可用的函数。在第一次输出到文件之前调用setlinebuf()强制每个使用“线缓冲”立即出去。
f = fopen("log.txt", "w"); if ( !f ) oops(); if ( debugging_mode ) setlinebuf( f );
无需单独调用fflush(),fsync()等
注意这会减慢执行大量输出的程序,因此将其保留用于调试模式对于某些程序的性能非常重要。
如果您没有setlinebuf(),请尝试以下操作,即C99:
setvbuf(f, (char *)NULL, _IOLBF, 0);
答案 1 :(得分:1)
您可以尝试在fflush(f);
函数调用之后放置fprintf()
,这将使数据立即被写入。
答案 2 :(得分:0)
使用fsync
:
FILE *f;
f = fopen("log.txt", "w");
fprintf(f, "cycle =%d\n", c);
fsync(f);
答案 3 :(得分:0)
在调用fprintf之后添加fflush(f)
应确保输出对其他程序可见(尽管不一定写入磁盘)。
如果这是您不能或不想修改的代码,并且您正在使用GDB进行调试,则可以让调试器使用call fflush(f)
为您调用fflush。
答案 4 :(得分:0)
看看这是否有帮助 - How to monitor log files in real-time?