清除stdout

时间:2016-09-07 05:46:11

标签: c++ stdout

在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

0 个答案:

没有答案