Передача массива, построенного из структуры, в функцию, которая сохраняет данные в массиве из файла - PullRequest
0 голосов
/ 12 марта 2019

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

Мой код выглядит следующим образом:

using namespace std;
const int LIST_SIZE = 10;
struct dinosaurInfo {
    string dinosaurName;
    string dinosaurClass;
    string dinosaurHabitat;
    double dinosaurSize;
    double dinosaurWeight;
    int battleRating;
};

void loadData(ifstream& getData, dinosaurInfo *data);

int main()
{
    dinosaurInfo data[LIST_SIZE];
    ifstream getData;
    ofstream giveData;
    getData.open("dinosaurRecords.txt");
    if (!getData)
    {
        cout << "Error loading in data." << endl;
    }

    loadData(getData, data);
    getData.close();

    system("pause");
    return 0;
}

void loadData(ifstream& getData, dinosaurInfo *data)
{
    while (!getData.eof()) 
    {
        for (int i = 0; i < 10; i++)
        {
            getline(getData, data[i].dinosaurName);
            getline(getData, data[i].dinosaurClass);
            getline(getData, data[i].dinosaurHabitat);
            cin.ignore();
            getData >> data[i].dinosaurSize;
            getData >> data[i].dinosaurWeight;
            getData >> data[i].battleRating;
        }
    }

Текстовый файл отформатирован следующим образом: (класс динозавров класс обитания рост вес боевой рейтинг). скриншот файла ниже

Может кто-нибудь помочь мне исправить это?

1 Ответ

0 голосов
/ 12 марта 2019

Основная проблема заключается в использовании getline для чтения строковых элементов.

getline(getData, data[i].dinosaurName);
getline(getData, data[i].dinosaurClass);
getline(getData, data[i].dinosaurHabitat);

Поскольку это токены, разделенные пробелами, используйте оператор >>, чтобы прочитать их.

getData >> data[i].dinosaurName;
getData >> data[i].dinosaurClass;
getData >> data[i].dinosaurHabitat;

Кроме того, избегайте использования

while (!getData.eof()) { ... }

См. Почему iostream :: eof внутри условия цикла считается неправильным? для получения подробной информации.

Версия вашей очищенной функции будет выглядеть так:

void loadData(ifstream& getData, dinosaurInfo *data)
{
    // Stop when 10 records are read.
    // Also, stop reading when getData is an error state.
    for (int i = 0; i < 10 && getData; i++)
    {
        getData >> data[i].dinosaurName;
        getData >> data[i].dinosaurClass;
        getData >> data[i].dinosaurHabitat;
        getData >> data[i].dinosaurSize;
        getData >> data[i].dinosaurWeight;
        getData >> data[i].battleRating;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...