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

したがって、C++ ストリームの実装ではなく、Windows コンソールの制限のようです。

于 2013-10-24T20:59:06.450 に答える