Сохранять текстовые данные, прочитанные из отформатированного текстового файла, в связанный список - PullRequest
0 голосов
/ 22 октября 2018

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

Структура определяется как:

struct Student {
  char stdID[10];
  char stdName[30];
  char stdSemester[5];
  Student  *next; } *Head, *Tail;

Код, которыйсохраняет структуру:

// For Saving: 
            SFile << std->stdID << '\t' << std->stdName << '\t' << std->stdSemester << '\n';

Код для чтения текстового файла и отображения структуры:

// Display:
system("cls");
cout << "\n\n\n";
cout << "\t\t\t\t           LIST OF COURSES" << endl;
cout << "\t\t\t   ====================================================\n" << endl;
cout << "\t" << "ID" << "\t" << setw(15) << "Course Name" << "\n\n";

// Initialize:
char ID[10];
char Name[30];
char Sem[5]; 
ifstream SFile("StudentRecord.txt");
Student *Temp = NULL;

while(!SFile.eof()) {

    // Get:
    SFile.getline(ID, 10, '\t');
    SFile.getline(Name, 30, '\t');
    SFile.getline(Sem, 5, '\t');

    Student *Std = new Student;   //<======== OUCH! Assignment error here
    //node*c=new node;

    // Assign:
    Std->stdID = *ID;

    if (Head == NULL) {
        Head = Std;
    } 
    else {
        Temp = Head;
        {
            while ( Temp->next !=NULL ) {
                Temp=Temp->next;
            }
            Temp->next = Std;
        }
    }
}
SFile.close();
system("pause"); }

PS: У меня проблема с назначением комментария;

Должен ли я изменить тип данных и сделать весь проект в string?Я предпочел char, потому что мне удалось отформатировать вывод, а в string я уверен, что он читает строку за строкой, поэтому я не смогу хранить значения из одной строки.

1 Ответ

0 голосов
/ 22 октября 2018

Чтобы использовать строки?

Если бы идентификаторы были std:string, вы могли бы сделать:

Std->stdID = ID;

И вы могли бы использовать std::getline():

getline(SFile, ID, '\t');

Вам не придется беспокоиться о максимальной длине, но вы все равно можете проверить длину строки и сократить ее при необходимости.

Или не использовать строки?

Но если вы предпочитаете (или должны) использовать char[] вместо этого, тогда вам нужно использовать strncpy() длявыполняя задания:

strncpy( Std->stdID, ID, 10 );  // Std->stdID = *ID;

Честно говоря, в 21-м веке, я бы пошел на std :: string, а не придерживался старого char[], датируемого 70-ми ...

Файловый цикл

Это не связано, но вы никогда не должны зацикливаться на eof:

while (SFile.getline(ID, 10, '\t') 
     && SFile.getline(Name, 30, '\t')  && SFile.getline(Sem, 5, '\n') {
   ...
}

Почему?Посмотрите здесь для получения дополнительных объяснений

И, кстати, ваш последний getline() должен обязательно искать '\n' в качестве разделителя, согласно вашей функции записи.

...