Каждая другая строка данных пропускается при чтении и сохранении данных из файла.

Я новичок в C ++, и у меня возникли небольшие проблемы, когда дело доходит до чтения строк данных из текстового файла. Допустим, у меня есть неизвестное количество строк в текстовом файле, каждая строка имеет одинаковый формат: int string double. Единственное, что будет определенным, — это пробел, отделяющий каждый фрагмент данных в данной строке. Я использую массив структур для хранения данных. Приведенный ниже код прекрасно работает, за исключением того, что он пропускает строку ввода после каждого цикла. Я попытался вставить различные операторы ignore () и до сих пор не могу заставить его читать каждую строку, только каждую другую строку. Если в конце я переписываю некоторые из операторов getline, то после первого цикла неправильные данные начинают храниться для переменных.

Текстовый файл может выглядеть так:

18 JIMMY 71.5
32 TOM 68.25
27 SARAH 61.4//code
struct PersonInfo
{
int age;
string name;
double height;
};
//..... fstream inputFile; string input;

PersonInfo *people;
people = new PersonInfo[50];

int ix = 0;
getline(inputFile, input, ' ');
while(inputFile)
{
people[ix].age = atoi(input.c_str());
getline(inputFile, input, ' ');
people[ix].name = input;
getline(inputFile, input, ' ');
people[ix].height = atof(input.c_str());

ix++;

getline(inputFile, input, '\n');
getline(inputFile, input, ' ');
}

Я уверен, что есть более продвинутые способы сделать это, но, как я уже сказал, я довольно новичок в C ++, так что, если в приведенный выше код внесены лишь небольшие изменения, это было бы здорово. Спасибо!

0

Решение

Вы можете выполнить чтение файла следующим образом:

int ix = 0;
int age = 0;
string name ="";
double height = 0.0;
ifstream inputFile.open(input.c_str()); //input is input file name

while (inputFile>> age >> name >>  height)
{
PersonInfo p ={age, name, height};
people[ix++] = p;
}
1

Другие решения

Вы сделали весь этот код до смешного сложным.

struct PersonInfo
{
int age;
string name;
double height;
};

std::vector<PersonInfo> people;
PersonInfo newPerson;
while(inputFile >> newPerson.age >> newPerson.name >> newPerson.height)
people.push_back(std::move(newPerson));

Ваша проблема в том, что сначала вы читаете каждый бит данных по одному из файла, затем целую строку из файла, а затем каждый бит данных по одному из файла снова. Может быть, то, что вы намеревались, было больше похоже на это?

std::string fullline;
while(std::getline(inputFile, fullline)) {
std::stringstream linestream(fullline);
std::getline(linestream, datawhatever);
....
}

Кстати, более идиоматический код может выглядеть примерно так:

std::istream& operator>>(std::istream& inputFile, PersonInfo& newPerson)
{return inputFile >> newPerson.age >> newPerson.name >> newPerson.height;}

{ //inside a function
std::ifstream inputFile("filename.txt");

typedef std::istream_iterator<PersonInfo> iit;
std::vector<PersonInfo> people{iit(inputFile), iit()}; //read in
}

Доказательство здесь работает

1

По вопросам рекламы [email protected]