2013-08-06 5 views
0

у меня есть файл с именем «wy.txt», он имеет некоторые целые числа, как это:о istream_iterator, я не знаю, почему

1 2 3 4 5 6 7 8 

Я использую istream_iterator<int> прочитать файл и использовать copy() для вывода данные в поток stdout.

тогда я использую тот же istream_iterator<int>, чтобы построить vector имени v, но размер v является 1, вы знаете, почему?

Это мой код:

ifstream file("wy.txt"); 
    istream_iterator<int> fileStream(file); 
    istream_iterator<int> eof; 

    // output: 1 2 3 4 5 6 7 8 
    copy(fileStream, eof, ostream_iterator<int>(cout, " ")); 
    cout<<endl; 

    vector<int> v(fileStream, eof); 
    // output: 1 
    cout<<v.size()<<endl; 
    // output: 1 
    for_each(v.begin(), v.end(), [](const int & t){cout<<t<" ";}); 
    cout<<endl; 

Edit:

У меня изменить мой код:

ifstream file("wy.txt"); 
    istream_iterator<int> fileStream(file); 
    istream_iterator<int> eof; 

    copy(fileStream, eof, ostream_iterator<int>(cout, " ")); 
    cout<<endl; 
    file.seekg(0, ios::beg); 
    file.clear(); 
    vector<int> v(fileStream, eof); 
    cout<<v.size()<<endl; 
    for_each(v.begin(), v.end(), [](const int & t){cout<<t<" ";}); 

... но это та же самая проблема.

+0

Вы очистили состояние EOF в файле, а затем перемотали его назад? –

+0

@ThomasMatthews Я не переустанавливаю состояние потока, можете ли вы рассказать мне, как это сделать? – BlackMamba

+0

Посмотрите 'clear' метод' iostream'. –

ответ

3

Разыменование istream_iterator<int> ведет себя как извлечение int из связанного файла:

int myInt; 
myInt = *fileStream; // same as file >> myInt; 

Это также означает, что вы на самом деле извлекается содержимое файла. Вы должны установить курсор ввода в начало снова:

file.clear(); // clear the EOF flag 
file.seekg(0); 
+0

Извините, вы не ответили. – BlackMamba

+0

Итераторы ввода (такие как ifstreams) не способны двигаться назад. Сброс только указателя файла не будет работать – P0W

+2

сначала, затем искать. –

0

Сброс всего файла указатель не будет работать

Clear внутреннего состояния ошибки флаги всех ifstream в состояниях с помощью clear. Затем используйте seekg

istream_iterator<int> fileStream(file); 
istream_iterator<int> eof; 
copy(fileStream, eof, ostream_iterator<int>(cout, " ")); 
cout<<endl; 
file.clear(); 
file.seekg(0); 
vector<int> v(fileStream, eof); 
cout<<v.size()<<endl; 
+0

Спасибо, можем ли мы сделать друга? – BlackMamba

Смежные вопросы