以学生管理系统为例,给出将链表写入,读取文件的例子
时间: 2023-07-25 19:20:24 浏览: 108
用链表与文件实现学生成绩管理系统.doc
下面是一个简单的学生管理系统,使用链表来存储学生信息,并且提供了将链表写入文件和从文件读取链表的功能。
```cpp
#include <iostream>
#include <fstream>
#include <string>
struct Student {
std::string name;
int age;
double score;
Student* next;
};
// 将链表写入文件
void writeToFile(Student* head, const std::string& filename) {
std::ofstream ofs(filename);
if (ofs.is_open()) {
Student* p = head;
while (p) {
ofs << p->name << " " << p->age << " " << p->score << std::endl;
p = p->next;
}
ofs.close();
} else {
std::cerr << "Failed to open file " << filename << " for writing!" << std::endl;
}
}
// 从文件中读取链表
Student* readFromFile(const std::string& filename) {
Student* head = nullptr;
std::ifstream ifs(filename);
if (ifs.is_open()) {
std::string name;
int age;
double score;
while (ifs >> name >> age >> score) {
Student* p = new Student {name, age, score, nullptr};
if (!head) {
head = p;
} else {
Student* q = head;
while (q->next) {
q = q->next;
}
q->next = p;
}
}
ifs.close();
} else {
std::cerr << "Failed to open file " << filename << " for reading!" << std::endl;
}
return head;
}
// 添加学生信息
void addStudent(Student*& head) {
std::string name;
int age;
double score;
std::cout << "Please input student name, age, score: ";
std::cin >> name >> age >> score;
Student* p = new Student {name, age, score, nullptr};
if (!head) {
head = p;
} else {
Student* q = head;
while (q->next) {
q = q->next;
}
q->next = p;
}
}
// 输出学生信息
void printStudent(Student* head) {
Student* p = head;
while (p) {
std::cout << p->name << " " << p->age << " " << p->score << std::endl;
p = p->next;
}
}
int main() {
Student* head = nullptr;
while (true) {
int choice;
std::cout << "Please select your operation: " << std::endl;
std::cout << "1. Add student" << std::endl;
std::cout << "2. Print student" << std::endl;
std::cout << "3. Write to file" << std::endl;
std::cout << "4. Read from file" << std::endl;
std::cout << "5. Exit" << std::endl;
std::cin >> choice;
switch (choice) {
case 1:
addStudent(head);
break;
case 2:
printStudent(head);
break;
case 3:
writeToFile(head, "students.txt");
break;
case 4:
head = readFromFile("students.txt");
break;
case 5:
return 0;
default:
std::cerr << "Invalid choice!" << std::endl;
}
}
}
```
在上述代码中,我们定义了一个名为Student的结构体来存储学生信息,其中包括姓名、年龄、分数和下一个节点的指针。我们使用一个指向链表头部的指针head来维护整个链表。在主函数中,我们使用一个while循环来不断接收用户的操作,并根据操作选择执行相应的功能。
当用户选择将链表写入文件时,我们调用writeToFile函数,该函数会打开一个指定的文件,并将链表中的每个节点的信息写入文件。当用户选择从文件中读取链表时,我们调用readFromFile函数,该函数会打开一个指定的文件,并逐行读取文件中的内容,然后将每行内容转换成一个新的节点,最终形成一个新的链表,并且将该链表的头指针返回。
在writeToFile函数中,我们使用了一个while循环遍历整个链表,并将每个节点的信息写入文件。在readFromFile函数中,我们使用了一个while循环读取文件中的每一行,并使用>>操作符来将每行内容中的姓名、年龄和分数分别读取出来,然后创建一个新的节点,并将其添加到链表的末尾。
在执行完writeToFile或readFromFile函数后,我们需要记得关闭文件,以避免造成资源浪费和文件损坏。
阅读全文