繁体   English   中英

链表上fstream的写入和读取功能

[英]Write and Read functions of fstream on a linked list

我对文件处理的概念很陌生。 我正在尝试创建一个待办事项列表,以跟踪文件中的每个修改。 我不确定如何实现此功能,因此我制作了一个简单的链表,并尝试将其读写到文件中,但失败了。 这是我的代码->

#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终止程序,一切都很好。 但是,当我第二次运行程序时,我在std::cout语句的打印函数中收到EXC_BAD_ACCESS error

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

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

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

一些建议:

  1. 从不做任何事情,不需要在C ++中将数据强制转换为char *
  2. 永远不要将内存地址存储在文件中(它们在重新分配后无用甚至有使用危险)
  3. 序列化您的结构以进行存储(例如google / protobuf

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM