我有一个小的 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吗?