将从格式化的文本文件中读取的文本数据存储到链接列表中

时间:2018-10-22 17:58:30

标签: c++ data-structures singly-linked-list formatted-input

我正在为学生课程注册系统开发项目。我从文本文件中读取数据并将其存储在单链列表中时遇到问题,每次添加新学生时,该列表都必须更新。数据以格式化的方式存储。问题是我的结构体的变量类型为 char ,因此它的状态为Assignment Error。

该结构定义为:

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"); }

P.S:我在分配评论时遇到问题;

我是否需要更改数据类型并在string中创建整个项目?我更喜欢char,因为我能够格式化输出,并且在string中,我确定它可以逐行读取,所以我将无法存储单行的值。

1 个答案:

答案 0 :(得分:1)

要使用字符串吗?

如果ID为std:string,则可以执行以下操作:

Std->stdID = ID;

您可以使用std::getline()

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

您不必担心最大长度,但是您仍然可以决定检查字符串的长度,并在必要时将其缩短。

还是不使用字符串?

但是,如果您更喜欢(或不得不)使用char[],则需要使用strncpy()进行分配:

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

诚实地说,在21世纪,我会选择std :: string,而不是坚持要追溯到70年代的旧char[] ...

文件循环

这无关紧要,但是您永远不要在eof上循环:

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

为什么?看here for more explanations

顺便说一句,根据您的书写功能,最后一个getline()当然应该寻找'\n'作为分隔符。