標準入力からコマンドを読み取り、それらを実行して結果を標準出力に出力する小さな 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 を使用しない方がよいでしょうか?