简介: 我正在研究Project @Student Course Registration System, 我的项目基于单链列表,并具有文件处理功能。
问题: 我设法修改了LinkedList中的节点,并做了一个单独的功能来更新我的文本文件。但是问题是文件没有更新。在控制台上,我确实看到了更新的项目。
我必须解决不修改临时文本文件并将其复制到该文本文件的问题,我知道该怎么做。
P.S:我已经创建了一个函数,该函数始终在启动时将所有必需的文本文件加载到程序中。
结构:
struct Student {
string stdID;
string stdName;
string stdSemester;
Student *next;
};
主要:
int main() {
Student *Head = NULL;
Student *Tail = NULL;
Course *Headd = NULL;
Course *Taill = NULL;
UpdateDirectory(Head, Tail, Headd, Taill);
Display(Head, Tail);
_getch();
string Value;
getline(cin, Value);
ModifyStudent(Value, Head);
UpdateFile(Head, Tail);
//Display(Head, Tail);
return 0;
}
修改功能:
void ModifyStudent(string Value, Student *&Head) {
// Initialize:
Student *Curr = NULL;
Student *Temp1 = NULL;
Student *Temp2 = NULL;
Student *Obj = new Student;
if (isEmpty(Head)) {
cout << "\t\t\t\t Underflow....\n\n";
_getch();
}
else {
Curr = Head;
Temp1 = Head;
while (Curr->stdID != Value) {
Temp1 = Curr;
Curr = Curr->next;
}
if (Curr->stdID == Value) {
cout << "\t\t\t\t Student Found!!\n\n";
cout << Curr->stdID << endl; // 1324
cout << Temp1->stdID << endl; // 3424
// Modify:
cout << "\t\t\t\t Enter New Student ID : ";
getline(cin, Obj->stdID);
cout << "\t\t\t\t Enter New Student Name : ";
getline(cin, Obj->stdName);
cout << "\t\t\t\t Enter New Semester : ";
getline(cin, Obj->stdSemester);
Temp1->next = Obj;
Obj->next = Curr->next;
Curr->next = NULL;
delete(Curr);
/// Save:
cout << "\t\t\t\t Record Is Being Updated, Please Wait.......\n\n" << endl;
_getch();
}
}
}
更新文件:
void UpdateFile(Student *&Head, Student *&Tail) {
Student *Temp = NULL;
fstream SFile;
SFile.open("StudentRecords.txt", ios::trunc);
if (isEmpty(Head)) {
cout << "\t\t\t\t UnderFlow\n" << endl;
}
else {
Temp = Head;
while (Temp->next != NULL) {
cout << Temp->stdID << '\t' << Temp->stdName << '\t' << Temp->stdSemester << '\n';
SFile << Temp->stdID << '\t' << Temp->stdName << '\t' << Temp->stdSemester << '\n';
Temp = Temp->next;
}
cout << Temp->stdID << '\t' << Temp->stdName << '\t' << Temp->stdSemester << '\n';
SFile << Temp->stdID << '\t' << Temp->stdName << '\t' << Temp->stdSemester << '\n';
_getch();;
}
_getch();;
}
我什至使用过ios :: trunc,但没有效果。 谢谢!
答案 0 :(得分:1)
很难说是什么问题。您没有提供完整的源代码。因此我们无法编译代码。
要写入文件,请使用以下命令。该文件将被覆盖(这似乎是您要查找的内容):
ofstream os{ "test.txt" };
if( !os )
return -1;
if( !list.write( os ) )
return -2;
关于您的代码,这是一种更像c ++的方法来处理单个链表:
定义数据类/结构。您可能希望将数据与其他类一起使用,而不只是与链表一起使用,因此请将其与节点分开:
class student_t
{
public:
string id;
string name;
string semester;
// ...
};
定义操作。您需要执行的一项操作是写:
ostream& write( ostream& os )
{
return os
<< id << endl
<< name << endl
<< semester << endl;
}
定义一个节点。节点由数据和指向下一个节点的指针组成:
class node_t
{
friend class list_t; // or replace it with public:
student_t data;
node_t* pnext;
// ...
};
添加构造函数和 write 方法:
node_t( const student_t& s, node_t* pnext ) : data{ s }, pnext{ pnext } {}
ostream& write_data( ostream& os )
{
return data.write( os );
}
定义列表类。列表类别包含的唯一数据是列表的标题。该类将收集所有列表操作,例如write_data
,push_front
,display_data
等。
class list_t
{
node_t* phead{ nullptr };
public:
void push_front( const char* id, const char* name, const char* semester )
{
phead = new node_t( student_t{ id, name, semester }, phead );
}
ostream& write( ostream& os )
{
node_t* pn = phead;
while( pn && pn->write_data( os ) )
pn = pn->pnext;
return os;
}
//...
};
这是您的使用方式:
int main()
{
list_t list;
list.push_front( "J1", "Jon", "first" );
list.push_front( "S1", "Steve", "first" );
{
ofstream os{ "test.txt" };
if( !os )
return -1;
if( !list.write( os ) )
return -2;
} // the file is automatically closed here
list.push_front( "A1", "Ava", "second" );
{
ofstream os{ "test.txt" };
if( !os )
return -1;
if( !list.write( os ) )
return -2;
}
return 0;
}