алгоритм копирования с помощью ifstream - PullRequest
6 голосов
/ 31 марта 2012

следующий код не ведет себя так, как я ожидал. Пожалуйста, помогите мне понять, как это работает.

#include <algorithm>
#include <iterator>
#include <fstream>
#include <vector>
#include <string>
using namespace std;

struct user
{
        string name;
        string age;
        string id;
};

istream& operator>>(istream& is, user& s)
{
        getline(is, s.name, ':');
        getline(is, s.age, ':');
        getline(is, s.id);

        return is;
}

int main(int argc, char* argv[])
{
        ifstream file("file.txt");
        vector<user> vec;
        copy(istream_iterator<user>(file), istream_iterator<user>(), back_inserter(vec));

        return 0;
}

Мой пользовательский оператор >> вызывается дважды, но я ожидаю, что он будет вызываться только один раз, потому что содержимое:

Джон: сорок: 21-5821-0

1 Ответ

3 голосов
/ 31 марта 2012

Как правило, для чтения всего файла вы читаете до тех пор, пока не произойдет сбой чтения.Тогда вы знаете, что либо что-то пошло не так, или вы их все поняли.В любом случае, вы не можете знать, что достигли конца файла, пока не прочитаете.Так как первый успешен, он должен попробовать второй раз, чтобы выяснить, есть ли второй элемент.Псудокод для этого -

while(in_stream >> object) {
   myvector.push_back(object);
}

Также обратите внимание, что это «идиоматический» способ чтения всего файла значений.Если вы проверяете eof, fail или bad, ваш код, вероятно, неверен.

Тем не менее, ваша istream& operator>>(istream& is, user& s) функция в порядке.Во второй раз, когда он вызывается, первый getline завершится ошибкой, установив поток в плохое состояние (eof), следующие два getline также не пройдут, и он вернет поток, и все работает отлично.Просто помните, что любая или все эти переменные могут содержать полную чушь, поскольку чтение не удалось.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...