0

我有一个小的 c++ 代码库,它从标准输入读取命令执行它们,然后将结果输出到标准输出。我为此使用宽输入流:wcin 和 wcout。我的问题是4000多个字符的大输入行被剪切了。我已经在 windows 和 osx 上测试了这个,问题出在两者上。

我创建了一个说明问题的最小程序:

#include <iostream>
#include <string>
#include <sstream>

using namespace std;

int main() 
{
    const size_t bufferSize = 2 * 4096;
    wchar_t lineBuffer[bufferSize] = {0};

    wcin.getline(lineBuffer, bufferSize); 
    wstring line(lineBuffer);

    wostringstream wos;
    wos << L", state of wcin, badbit: " << wcin.bad();
    wos << L", eof: " << wcin.eof();
    wos << L", failbit: " << wcin.fail();

    wcout << L"The input: " << line << wos.str() << endl; 

    return 0;
}

请注意,当问题出现时,eof、failbit 和 badbit 看起来都正常。

代码也可以在这里找到,评论中有一个测试字符串: https ://github.com/Discordia/large-std-input

我可以通过将 wcin 的缓冲区大小设置为 4096 来解决这个问题(请注意,它比输入小,但 getline 缓冲区比输入大),方法是:

const size_t wcinBufferSize = 4096;
wchar_t wcinBuffer[wcinBufferSize] = {0};
wcin.rdbuf()->pubsetbuf(wcinBuffer, wcinBufferSize); 

但这只会稍微推动问题。如果输入很大,比如 9000 个字符(然后我将 wcin.getline 缓冲区的大小提高到 4 * 4096),问题就会再次出现。

如果我不知道输入会增长多大,最好的方法是什么?我不应该使用getline吗?

4

1 回答 1

1

使用 VS2012,当我将字符串粘贴到控制台窗口时,我可以看到输入被切断。但是如果我将这个长字符串保存到一个文件中,然后使用从所述文件重定向的输入运行程序,它就可以工作,如test.exe < input.txt.

所以这似乎是 Windows 控制台的限制,而不是 C++ 流实现的限制。

于 2013-10-24T20:59:06.450 回答