Сохранять текстовые данные, прочитанные из отформатированного текстового файла, в связанный список

Я работаю над проектом системы регистрации студенческих курсов. У меня проблемы с чтением данных из текстового файла и сохранением их в односвязном списке, который должен обновляться каждый раз, когда добавляется новый студент. Данные хранятся в отформатированном виде. Проблема в том, что моя структура имеет тип 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"); }

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

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

-2

Решение

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

Если бы идентификаторы были 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' в качестве разделителя, в соответствии с вашей функцией письма.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]