std :: wcout将在一定数量的字符后打印

时间:2017-02-12 07:37:53

标签: c++ file

我一直在用这一个用头撞墙。我只想创建一个简单的应用程序来读出文件的内容。这是一些代码:

errno_t error;
if ((error = fopen_s(&f, file, "r")) == 0) {
    while (true) {
        std::wcout << std::endl << "NEW RUN" << std::endl;
        wchar_t content[4096];
        if (fgetswc(content, 4096, f) == 4096) {
            std::wcout << content;
            std::wcout.flush();
        }
        else {
            std::wcout << content;
            std::wcout.flush();
            break;
        }
    }
    fclose(f);
    std::wcout << "PLEASE PRINT THIS NOW";
    system("pause");
    return 0;
}

自定义fgetswc函数:

int fgetswc(wchar_t buffer[], int count, FILE * f) {
    for (int i = 0; i < count; i = i + 1) {
        wchar_t c = fgetwc(f);
        if (c != WEOF) {
            buffer[i] = c;
        } else {
            return i;
        }
    }
    return count;
}

它读取文件中的前4096个字节,但随后的std::wcout调用将不会打印到我拥有的控制台。它读取文件的其余部分并成功结束,我可以看到使用断点和调试器。 content每次迭代都会被填满。我也试图输入调试语句,但即使那些也没有打印。我只是做错了吗?据我所知,我的文件中没有特殊字符,它只是一个日志文件。

1 个答案:

答案 0 :(得分:1)

std::wcout << content;

这实际上是在调用std::wostream::operator<<(const wchar_t *)。它不知道content不是以␀结尾的字符串。实际上,它可能不知道它在第一种情况下的有效长度为4096,而在第二种情况下有一些数量较少(您不能保存fgetswc的返回值)。