2

完全なファイルの内容を文字のベクトルに読み込むことに関するistream_iterators を使用したベクトルの構築を読んでいました。ファイルの一部を文字のベクトルにロードしたいのですが。

#include <iostream>
#include <fstream>
#include <iterator>
#include <vector>
#include <algorithm>

using namespace std;

int main(int argc, char *argv[])
{
    ifstream ifs(argv[1], ios::binary);
    istreambuf_iterator<char> beginItr(ifs);
    istreambuf_iterator<char> endItr(beginItr);
    advance(endItr, 4);
    vector<char> data(beginItr, endItr);
    for_each(data.cbegin(), data.cend(), [](char ch)
    {
            cout << ch << endl;
    });
}

前述の質問の受け入れられた回答は機能しますが、事前は機能しないため、これは機能しません。事前に機能しないのはなぜistreambuf_iteratorですか?

また

  endItr++;
  endItr++;
  endItr++;
  endItr++;
  cout << distance(beginItr, endItr) << endl;

0 を返します。何が起こっているのか誰か説明してください!

4

3 に答える 3

10

istreambuf_iterator でアドバンスが機能しないのはなぜですか?

できます。イテレータを進めます。問題は、 anistreambuf_iterator入力イテレーターであり、フォワード イテレーターではないことです。つまり、これはシングル パス イテレーターです。一度進めると、前の状態に再びアクセスすることはできません。必要なことを行うには、4 までカウントする昔ながらの for ループを使用するだけです。

于 2012-09-03T10:14:47.790 に答える
2

istreambuf_iteratorから連続するバイトを読み取りますbasic_streambufbasic_istream::seekgポジショニング (および)はサポートされていませんbasic_istream::tellg

これは、単一パスの入力反復子であり、前方反復子またはランダムアクセス反復子ではないためです。ポジショニングをサポートしていないストリーム (パイプや TCP ソケットなど) を処理できるように設計されています。

file/ifstream に対する双方向反復子の解決策のいくつかが役立つ場合があります。

于 2012-09-03T10:43:05.053 に答える