在C ++程序中,我希望所有日志记录都显示在终端和文件中。该程序有很多printf()用法,删除它们是不可行的。
为了实现这一点,我设置了stdout和stderr以使用我自己的缓冲区和setvbuf()。每次运行我的日志功能时,它都会将数据的副本从stdout保存到日志文件,然后刷新stdout和sterr。但是在flush()之后,似乎缓冲区实际上没有被清除;除非我memset()整个缓冲区,stdout数据的一部分会出现多次。 终端输出正确。
#include <string>
#include <cstring>
#include <cstdio>
char stdoutBuffer[100000];
void log(const std::string& msg, FILE* file) {
fwrite(stdoutBuffer, 1, strlen(stdoutBuffer), file); //write data accumulated in stdout to file
fwrite(msg.c_str(), 1, msg.size(), file); //save our own stuff to file
puts(msg.c_str()); //for completeness put our own log to the console
fflush(stdout);
//stdoutBuffer[0] = 0; //reduces duplication
//memset(stdoutBuffer, 0, sizeof(stdoutBuffer)); //seems to be correct
}
int main() {
fflush(stdout);
setvbuf(stdout, stdoutBuffer, _IOFBF, sizeof(stdoutBuffer));
FILE* file = fopen("file.txt", "wb");
int count = 0;
for(int i = 0; i < 3; i++) {
printf("log nr %d\n", count);
count += 1;
char buf[100];
sprintf(buf, "log nr %d\n", count);
log(std::string(buf), file);
count += 1;
}
}
文件的实际内容:
log nr 0
log nr 1
log nr 2
log nr 1
log nr 3
log nr 4
log nr 3
log nr 5
预期内容(使用完整的memset实现):
log nr 0
log nr 1
log nr 2
log nr 3
log nr 4
log nr 5