在链表上写入和读取 fstream 的函数

Write and Read functions of fstream on a linked list

本文关键字:读取 fstream 函数 链表      更新时间:2023-10-16

我对文件处理的概念很陌生。我正在尝试制作一个待办事项列表,该列表可以跟踪文件中的每次修改。我不确定如何实现这一点,所以我做了一个简单的链表,并尝试读取和写入文件,但我失败了。 这是我的代码 ->

#include <iostream>
#include <fstream>
struct node{
int val;
node *next = NULL;
};
void add(node *&head, int val){
node *newPtr = new node;
if(head==NULL){
newPtr->val = val;
head = newPtr;
}
else{
newPtr->val = val;
newPtr->next = head;
head = newPtr;
}
}
void print(node *head){
node *temp;
temp = head;
while(temp!=0){
std::cout << (*temp).val << " ";
temp = temp->next;
}
std::cout << std::endl;
}
int main(){
node *head = NULL;
int val;
std::ofstream filout;
filout.open("data.txt",std::ios::out|std::ios::app|std::ios::binary);
while(true){
std::cin>>val;
if(val==0)
break;
else{
add(head,val);
filout.write((char*)&head, sizeof(head));
}
}
std::ifstream filin;
filin.open("data.txt",std::ios::in|std::ios::binary);
filin.read((char*)&head, sizeof(head));
print(head);
return 0;
}

我应该对我的代码进行哪些修改才能正确处理?

更新:

当我第一次尝试执行程序时,我可以轻松地插入一些值并通过键入 0 来终止程序,一切都很好。但是一旦我第二次运行该程序,我的打印功能就会EXC_BAD_ACCESS errorstd::cout语句

好的,让我们一步一步来。

在 std::ios::out|std::ios:
  1. :app|std::ios::二进制模式下打开文件意味着:
    • 输出
    • 追加(打开文件并查找到最后(
    • 二进制(关于行尾的东西,最好谷歌一下(
  2. 读取数据并存储数据
    • 读取值
    • 将其添加到列表
    • 存储在文件中(注意:filout.write((char*)&head, sizeof(head));将节点的地址存储在内存中(
  3. 打开文件进行读取(无需关闭!(并将第一个值读取到head中。

因此,在第二次启动后,您读取节点的第一个地址。

一些建议:

  1. 从不做事涉及在 C++ 中将数据强制转换为 char* 而不必要
  2. 切勿将内存地址存储在文件中(它们在重新分配后无用甚至有危险(
  3. 序列化结构来存储它(如谷歌/protobuf(