Чтение ";" файл с разделителями в структуру массива символов - PullRequest
2 голосов
/ 23 мая 2011

Я пытаюсь прочитать набор значений из текстового файла в массив структур массивов. Каждая из записей разделена символом «\ n», и каждая запись состоит из 3 значений, разделенных знаком «;».

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

Ниже приведены данные испытаний.

CS162;Finish Lab 2;9/26/2009
CS201;Take Quiz 1;9/28/2009

После считывания тестовых данных вывод моей программы ниже.

Your tasks are:
Finish Lab 2 for CS162 is due 9/26/2009
CS201
 for  is due

Циклы, которые считывают файл в массив и выводят содержимое массива, приведены ниже. Мой полный код будет в конце вопроса.

for ( ; InputFile.peek() != EOF; ListSize++ )
{
      InputFile.get(TaskList[ListSize].Course, BUFFERSIZE, ';');
      InputFile.ignore(BUFFERSIZE, ';');
      InputFile.get(TaskList[ListSize].Assignment, BUFFERSIZE, ';');
      InputFile.ignore(BUFFERSIZE, ';');
      InputFile.get(TaskList[ListSize].DueDate, BUFFERSIZE, ';');
      InputFile.ignore(BUFFERSIZE, '\n');
}

cout << "Your tasks are:" << endl;
for ( int Iteration = 0; Iteration <= ListSize; Iteration++ )
{
    cout << TaskList[Iteration].Assignment << " for " << TaskList[Iteration].Course << " is due " << TaskList[Iteration].DueDate << endl;
}

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

Ответы [ 2 ]

2 голосов
/ 23 мая 2011

Возможно, последнее получение должно быть:

InputFile.get(TaskList[ListSize].DueDate, BUFFERSIZE, '\n');

вместо

InputFile.get(TaskList[ListSize].DueDate, BUFFERSIZE, ';');

Ваше последнее поле (срок выполнения) не имеет точку с запятой в конце, только символ новой строки.

Обновление: Я предлагаю вам также использовать getline вместо get.Они имеют схожую функциональность, но getline также будет использовать разделитель, что означает, что вам не нужно использовать ignore ().

1 голос
/ 23 мая 2011

Не думая о написанном вами коде, я просто скажу, что мой обычный шаблон для этого типа проблемы:

while (readline) {processline;}

Инкрементная обработка файлов с большей вероятностью может столкнуться с проблемами, если у вас не все правильно.

...