9

read()aの内容をバッファーに入れたい場合はstd::istream、バッファーの大きさを知るために、まず利用可能なデータの量を調べる必要があります。そして、istream から利用可能なバイト数を取得するために、私は現在次のようなことをしています:

std::streamsize available( std::istream &is )
{
    std::streampos pos = is.tellg();
    is.seekg( 0, std::ios::end );
    std::streamsize len = is.tellg() - pos;
    is.seekg( pos );
    return len;
}

同様に、 std::istream::eof() は非常に有用なファンディング AFAICT ではないため、istreamの get ポインターがストリームの最後にあるかどうかを調べるために、次のようにしています。

bool at_eof( std::istream &is )
{
    return available( is ) == 0;
}

私の質問:

から利用可能なバイト数を取得するより良い方法はありますistreamか? 標準ライブラリにない場合は、おそらくブーストで?

4

2 に答える 2

4

バッファリングはすでにバッファリングされているため、バッファリングについてstd::cin心配する必要はありません。また、ユーザーが何個のキーを押すかを予測することもできません。

std::ifstream同じくバッファリングされるオープンされたバイナリの場合、seekg(0, std::ios:end)およびtellg()メソッドを呼び出して、存在するバイト数を確認できます。

gcount()読んだ後にメソッドを呼び出すこともできます:

char buffer[SIZE];

while (in.read(buffer,SIZE))
{
  std::streamsize num = in.gcount();
  // call your API with num bytes in buffer 
}

テキスト入力の場合、その文字列を介して読み取りstd::getline(inputstream, a_string)、後で分析すると便利です。

于 2011-07-12T15:53:24.810 に答える
3

OPが望んでいるように見えるので、これを回答として投稿します。

バッファをどれだけ大きくするかを知るために、最初に利用可能なデータの量を調べる必要がありますが、そうではありません。私のこの回答を参照してください(第2部)。

于 2011-07-12T16:22:06.050 に答える