c ++, почему этот цикл некорректен для чтения данных в массиве struct? - PullRequest
0 голосов
/ 28 февраля 2012

Я читаю название песни, исполнителя и размер песни.но это только чтение в первом наборе, после этого это дает мне сумасшедшие неправильные значения.Мой код довольно прост и понятен, поэтому мне интересно, кто-нибудь может дать мне представление о том, куда обратиться.

struct Songs
{
    string title;
    string artist;
    int men;
};
// main stuff

Songs song[50];
int size=0;

for (int i = 0; i<size;i++)
{
    do
    {
        getline(fin, song[size].title);
        getline(fin, song[size].artist);
        fin >> song[size].mem;
        size++;
        i++;
    }
    while (song[size].title.length()>0);
}

Ответы [ 3 ]

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

Этот код не должен делать ничего , поскольку и i, и size равны нулю при запуске цикла for.Или, точнее, не start: -)

Если вы хотите читать триплеты из входного потока, пока не будет заполнен пустой заголовок или ваш массив, вы можете начать с чего-токак:

// Initialise size.

int size = 0;

// Try to get first title.

getline (fin, song[size].title);

// While a title was successfully read.

while (song[size].title.length() > 0) {
    // Get artist and mem (watever that is).

    getline (fin, song[size].artist);
    fin >> song[size].mem;

    Move to next array element, prevent overflow by loop exit.

    if (++size == 50)
        break;

    // Try to get next title.

    getline (fin, song[size].title);
}

// Out here, size is the number of array elements used (0-50).

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

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

В коде множество ошибок.

1) Вы устанавливаете размер равным 0, затем пытаетесь запустить цикл for, который из-за этого не запускается.

2) У вас есть цикл do-while внутри цикла for, который, по-видимому, не нужен для задачи, которую вы пытаетесь выполнить, если я правильно понимаю.

3) При попытке заполнить структуры вы используете переменную размера в качестве индекса массива. Обычно вы используете переменную итератора, которую вы устанавливаете при инициализации цикла for, в данном случае i. Вы также не должны увеличивать размер одновременно с i, поскольку вы можете получить бесконечный цикл.

4) У вас нет кода с отступом! Не совсем ошибка, но это затрудняет отладку - и это может быть одной из причин, почему вы боретесь с самого начала. (РЕДАКТИРОВАТЬ: кажется, это было исправлено, сейчас.)

Вообще говоря, если вы читаете из файла, одним из методов будет иметь целое число в начале файла, которое указывает количество создаваемых вами объектов, что позволяет вам выделять соответствующий объем памяти. в кучу, при этом также устанавливая переменную размера. Затем вы реализуете цикл for, используя эту переменную размера для считывания данных в структуры.

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

По крайней мере, while (song[size].title.length()>0) смотрит на song[size] после того, как size уже увеличилось. Попробуйте song[size-1].

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