C ++ чтения в структуре массива проблемы - PullRequest
0 голосов
/ 28 февраля 2012

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

struct Instruments 
{
string model;
string maker;
int year;
};

int main()
{
int size;
Instruments data[20];
int i =0;

ifstream fin;
fin.open("input.txt");

for (i=0; i<20; i++)
{
 do{
getline(fin, data[size].model);
    getline (fin, data[size].maker);
fin >> data[size].year;

    size++;
 }
 while (data[size].model.length() > 0);
 }

fin.close();

for(int i=0;i<size; i++)
{
        cout << data[i].model << "model"<<endl;
        cout << data[i].maker << "maker" << endl;
        cout << data[i].year<< " year" << endl;
}
return 0;
}

Ответы [ 3 ]

1 голос
/ 28 февраля 2012

Здесь есть несколько проблем:

  1. Ваш первый цикл for использует i в качестве счетчика цикла, но size в качестве индекса массива.

  2. После этого вызова:

    fin >> data[size].year

    он будет читать до конца числа, и любые последующие пробелы станут частью вашего следующего чтения, так что есливы ожидаете начать следующую запись со следующей строки, здесь тоже выполните пустую строку getline.

Кроме этого.

  1. Использовать векторы немассивы
  2. Есть метод для чтения из потока в вашу структуру, и если это удастся, используйте push_back (), чтобы добавить его к вашему вектору.

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

1 голос
/ 28 февраля 2012

size переменная не инициализирована. В C ++ переменные не инициализируются автоматически.

Вы должны добавить:

int size = 0;
0 голосов
/ 28 февраля 2012

Это всего лишь предположение. В дополнение к отсутствующей инициализации size, следующее:

do{
.....
}
while (data[size].model.length() > 0);

выглядит также довольно подозрительно для меня: как только data[size].model будет иметь некоторый контент (который он делает после первого чтения, он оценивается как true, и вы, вероятно, имеете бесконечный цикл.

Если вы правильно создаете цикл for, вам не нужен цикл do-while.

...