как мне прочитать данные из текстового файла и вернуть их в вектор?

У меня есть текстовый файл "test.txt", в котором мои данные хранятся следующим образом, между каждым полем разделителя есть интервал.

Код: Имя: Кой

045: Ted: Coy1
054: Red: Coy2

Как мне прочитать эти данные из файла и вставить их в вектор?

vector <Machine> data;
Machine machine

void testclass(){
ifstream inFile("test.txt");
if (!inFile){
    cout << "File couldn't be opened." << endl;
    return;
}
while(!inFile.eof()){
    string code,name,coy;
    getline(inFile,code, ':');
    getline(inFile,name, ':');
    getline(inFile,coy, ':');
data.push_back(machine)

}

но, похоже, проблема с отправкой данных


person user1745860    schedule 27.01.2013    source источник
comment
while(!inFile.eof()) здесь неверно. Какая книга поручила вам это сделать?   -  person Lightness Races in Orbit    schedule 27.01.2013


Ответы (2)


Как уже указывали другие, одна проблема заключается в том, что вы читаете данные в локальные переменные (code, name и coy), но никогда не помещаете эти значения в machine до того, как добавите их в вектор.

Однако это не единственная проблема. Ваш while (!infile.eof()) тоже неверен (на самом деле, while (!whatever.eof()) по существу всегда неверен). Что вы обычно хотите сделать, так это продолжить чтение, пока чтение было успешным. whatever.eof() вернет значение true только после того, как вы попытаетесь выполнить чтение и достигнете конца файла до начала чтения.

Обычно я исправляю это, определяя экстрактор потока для вашего класса Machine:

class Machine { 
// ...

    friend std::istream &operator>>(std::istream &is, Machine &m) { 
        std::getline(is, m.code, ':');
        std::getline(is, m.name, ':');
        std::getline(is, m.coy, ":");
        return is;
    }
};

Используя это, вы можете читать что-то вроде этого:

std::vector<Machine> machines;

Machine machine;

while (infile >> machine) 
    machines.push_back(machine);

После того, как вы определили экстрактор потока для типа, есть еще одна возможность, которую следует рассмотреть; вы можете инициализировать вектор из пары итераторов:

std::vector<Machine> machines((std::istream_iterator<Machine>(infile)),
                               std::istream_iterator<Machine>());

... и это будет считывать все данные из файла (используя operator>>, который мы определили выше) и использовать их для инициализации вектора machines.

person Jerry Coffin    schedule 27.01.2013

вы должны прочитать данные и поместить их в переменные-члены объекта класса Machine. а затем поместите этот объект в вектор.

person Debobroto Das    schedule 27.01.2013