2011-07-12 13 views
4

もし私がread()の内容をstd::istreamにバッファーしたいのであれば、バッファーを作るのにどれくらいの大きさがあるのか​​をまず知る必要があります。 std ::のIStream :: EOFが()に、非常に便利なfundtionのAFAICTではないので、std :: istreamから利用可能なバイト数を調べるにはどうすればよいですか?

​​

と同様:及びIStreamから使用可能なバイト数を取得するには、私は現在、このような何かをしていますistreamのポインタを取得するかどうかを調べる、ストリームの末尾にある、私はこれをやっている:

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

私の質問:

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

+4

*バッファを作るにはどれくらいの大きさのデータが最初に利用可能であったかを知る必要があります。 [この回答は、私の](http://stackoverflow.com/questions/5420317/c-reading-and-writing-binary-file/5420568#5420568)(2番目の部分)を参照してください。 –

+0

うわー、面白い答え。私はこれがうまくいくと思います。ありがとうございました! – edam

+0

@edam:バッファサイズをあらかじめ知っておく必要があるのはなぜですか?バッファの量だけ読み込めませんか? –

答えて

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)を経由して読んで役立つことができ、その後その文字列を解析し、テキスト入力のために。

3

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

バッファーを作るにはどれぐらいの大きさのデータが最初に利用可能であるかを調べる必要があります。 - そうではありません。 this answer of mine(2番目の部分)を参照してください。

+0

これはかなりうまくいかないようです... 'istream_iterator < char >'を使うと 'istream'のスペースをスキップします。したがって、最後に終わる 'ベクトル< char>'バッファにはすべての空白が削除されています! – edam

関連する問題