2 leoe LEoe_ 于 2016.04.18 11:04 提问

关于c++将文件内容读取到链表中

图片说明图片说明图片说明

10个回答

qq423399099
qq423399099   Ds   Rxr 2016.04.19 12:51
已采纳
 #include<string>
#include<iostream>
#include<fstream>
#include <stdlib.h>
using namespace std;

class Person
{
protected:
    string name;
    int age;
    string sex;
};

class Doctor:public Person
{
public:
    void show();
    void del();
    void add();
    void refer();
    void save();
    void open();
    Doctor *get();
    Doctor *find_d(int card);
protected:
    string spe;
    double fee;
    int son_d;
//private:
public:
    Doctor *next,*head,*prece;
};

void Doctor::open()
{
    FILE *fp;
    Doctor *p1,*p2;
    head=new Doctor;
    head->prece=NULL;
    p1=head;
    ifstream infile("file.txt",ios::in|ios::binary);
    p2=new Doctor;
    while(infile.read((char*)p2,sizeof(Doctor)))
    {
        cout<<p2->age;
        p1->next=p2;
        p2->prece=p1;
        p1=p2;
        cout<<"aaaa"<<endl;
        p2=new Doctor;
    }
    p1->next = NULL;
    infile.close();
}
void Doctor::save()
{
    Doctor *p;
    p=head->next;
    fstream outfile("file.txt",ios::out|ios::binary);
    if(!outfile)
    {
        cout<<"打开文件失败!"<<endl;
    }
    else
    {
        while(p)
        {
            outfile.write((char *)p,sizeof(Doctor));
            p=p->next;
            cout << "haha" << endl;
        }
    }
    outfile.close();
}
Doctor* Doctor::find_d(int card)
{
    int card2;
    Doctor *p;
    p=head->next;
    while(p)
    {
        card2=p->son_d;
        if(card2==card)
        {
            return p;
        }
        else
        {
            p=p->next;
        }
        if(!p)
        {
            return p=NULL;
        }
    }

}
Doctor* Doctor::get()
{
    Doctor *p=new Doctor;

    cout<<" 姓名:";
    cin>>p->name;
    cout<<" 医生编号:";
    cin>>p->son_d;
    cout<<" 年龄:";
    cin>>p->age;
    cout<<" 性别:";
    cin>>p->sex;
    cout<<" 专业:";
    cin>>p->spe;
    cout<<" 诊费:";
    cin>>p->fee;

    return p;
}

void Doctor::add()
{
    Doctor *p1,*p2;
    char y;
    p1=head;
    cout<<"请输入要添加的医生信息:"<<endl;
    p2=get();

    if(p1->next!=NULL)
        p1->next->prece=p2;
    if(p1->next==NULL)
        p2->next=NULL;
    p2->prece=p1;
    p2->next=p1->next;
    p1->next=p2;


    cout<<"医生信息添加成功!"<<endl;
    cout<<"是否继续添加医生信息?(y/n)"<<endl;
    cin>>y;

    if(y=='y'||y=='Y')
    {
        add();
    }
    else
    {
        return;
    }
}



void Doctor::del()
{
    int card;
    Doctor *p;
    cout<<"请输入要删除医生信息的医生编号:";
    cin>>card;
    p=find_d(card);

    if(p==NULL)
    {
        cout<<"对不起!查无此人。"<<endl;
    }
    else
    {
        p->prece->next=p->next;
        if(p->next!=NULL)
            p->next->prece=p->prece;
        delete p;
        cout<<"删除成功!"<<endl;
    }
}


void Doctor::refer()
{
    Doctor *p;
    cout<<"输入要查询的医生信息的医生编号:";
    int card;
    cin>>card;
    p=find_d(card);
    if(p==NULL)
    {
        cout<<"对不起!查无此人。"<<endl;
    }
    else
    {
        cout<<"姓名:";
        cout<<p->name;
        cout<<"    医生编号:";
        cout<<p->son_d;
        cout<<"    年龄:";
        cout<<p->age;
        cout<<"    性别:";
        cout<<p->sex;
        cout<<"    专业:";
        cout<<p->spe;
        cout<<"    诊费:";
        cout<<p->fee;
    }
}


void Doctor::show()
{
    Doctor *p;

    p=head->next;

    while(p)
    {
        cout<<" 姓名:";
        cout<<p->name;
        cout<<"    医生编号:";
        cout<<p->son_d;
        cout<<"    年龄:";
        cout<<p->age;
        cout<<"    性别:";
        cout<<p->sex;
        cout<<"    专业:";
        cout<<p->spe;
        cout<<"    诊费:";
        cout<<p->fee;

        p=p->next;
        cout<<endl;
    }
}

int main()
{
    Doctor d;
    d.head = new Doctor;
    d.head->prece = NULL;
    d.head->next = NULL;
    //d.add();
    d.open();
    d.show();
    //d.save();

    return 0;
}

LEoe_
LEoe_   2016.04.18 13:40

图片说明

qq423399099
qq423399099 回复LEoe_: 楼主你的文件什么情况。。。
2 年多之前 回复
LEoe_
LEoe_ 回复小灸舞好了,你看下,麻烦了
2 年多之前 回复
qq423399099
qq423399099 楼主贴一下完整的代码吧,不要截图(代码放在代码标识里),顺便也贴一下文件里的内容吧
2 年多之前 回复
LEoe_
LEoe_   2016.04.18 11:05

为什么链表读取完文件的内容后却输出不出来???

LEoe_
LEoe_   2016.04.18 11:08

![图片说明](https://img-ask.csdn.net/upload/201604/18/1460948865_458959.png)图片说明而且我在读取中加入标示,标示读取了三次,说明读取成功了,但是为什么就是输出不出来?

LEoe_
LEoe_   2016.04.18 11:13

图片说明

beifengche
beifengche   2016.04.18 11:45

你调试一下,在输出是看一下变量。

LEoe_
LEoe_ 是继承过来的,好像输出不出来
2 年多之前 回复
LEoe_
LEoe_ 因为name
2 年多之前 回复
wulijuan888
wulijuan888   2016.04.18 12:07

不知道,为什么链表读取完文件的内容后却输出不出来???

qq423399099
qq423399099   Ds   Rxr 2016.04.18 12:51

应该是你的read有问题
建议贴一下Doctor这个类
目测你Doctor类的name成员应该是个指针吧?不是一个字符数组吧,没有new过空间,直接read进去了,这样之后访问的时候肯定因为之前的越界写入而崩溃

LEoe_
LEoe_ 额,name是继承过来的string类型的
2 年多之前 回复
LEoe_
LEoe_   2016.04.18 14:23

 #include<string>
#include<iostream>
#include<fstream>
#include <stdlib.h>
using namespace std;

class Person
{
protected:
    string name;
    int age;
    string sex;
};

class Doctor:public Person
{
public:
    void show();
    void del();
    void add();
    void refer();
    void save();
    void open();
    Doctor *get();
    Doctor *find_d(int card);
protected:
    string spe;
    double fee;
    int son_d;
private:
    Doctor *next,*head,*prece;
};

void Doctor::open()
{
    FILE *fp;
    Doctor *p1,*p2;
    p1=head;
    ifstream infile("file.txt",ios::in|ios::binary);
    while(!infile.eof())
    {
        p2=new Doctor;
        infile.read((char*)p2,sizeof(Doctor));
        cout<<p2->age;
        p1->next=p2;
        p2->prece=p1;
        p1=p2;
        cout<<"aaaa"<<endl;
    }
    infile.close();
}
void Doctor::save()
{
    Doctor *p;
    p=head->next;
    fstream outfile("file.txt",ios::out|ios::binary);
    if(!outfile)
    {
        cout<<"打开文件失败!"<<endl;
    }
    else
    {
        while(p)
        {
            outfile.write((char *)p,sizeof(Doctor));
            p=p->next;
        }
    }
    outfile.close();
}
Doctor* Doctor::find_d(int card)
{
    int card2;
    Doctor *p;
    p=head->next;
    while(p)
    {
        card2=p->son_d;
        if(card2==card)
        {
            return p;
        }
        else
        {
            p=p->next;
        }
        if(!p)
        {
            return p=NULL;
        }
    }

}
Doctor* Doctor::get()
{
    Doctor *p=new Doctor;

    cout<<" 姓名:";
    cin>>p->name;
    cout<<" 医生编号:";
    cin>>p->son_d;
    cout<<" 年龄:";
    cin>>p->age;
    cout<<" 性别:";
    cin>>p->sex;
    cout<<" 专业:";
    cin>>p->spe;
    cout<<" 诊费:";
    cin>>p->fee;

    return p;
}

void Doctor::add()
{
    Doctor *p1,*p2;
    char y;
    p1=head;
    cout<<"请输入要添加的医生信息:"<<endl;
    p2=get();

    if(p1->next!=NULL)
        p1->next->prece=p2;
    if(p1->next==NULL)
        p2->next=NULL;
    p2->prece=p1;
    p2->next=p1->next;
    p1->next=p2;


    cout<<"医生信息添加成功!"<<endl;
    cout<<"是否继续添加医生信息?(y/n)"<<endl;
    cin>>y;

    if(y=='y'||y=='Y')
    {
        add();
    }
    else
    {
        return;
    }
}



void Doctor::del()
{
    int card;
    Doctor *p;
    cout<<"请输入要删除医生信息的医生编号:";
    cin>>card;
    p=find_d(card);

    if(p==NULL)
    {
        cout<<"对不起!查无此人。"<<endl;
    }
    else
    {
        p->prece->next=p->next;
        if(p->next!=NULL)
            p->next->prece=p->prece;
        delete p;
        cout<<"删除成功!"<<endl;
    }
}


void Doctor::refer()
{
    Doctor *p;
    cout<<"输入要查询的医生信息的医生编号:";
    int card;
    cin>>card;
    p=find_d(card);
    if(p==NULL)
    {
        cout<<"对不起!查无此人。"<<endl;
    }
    else
    {
        cout<<"姓名:";
        cout<<p->name;
        cout<<"    医生编号:";
        cout<<p->son_d;
        cout<<"    年龄:";
        cout<<p->age;
        cout<<"    性别:";
        cout<<p->sex;
        cout<<"    专业:";
        cout<<p->spe;
        cout<<"    诊费:";
        cout<<p->fee;
    }
}


void Doctor::show()
{
    Doctor *p;

    p=head->next;

    while(p)
    {
        cout<<" 姓名:";
        cout<<p->name;
        cout<<"    医生编号:";
        cout<<p->son_d;
        cout<<"    年龄:";
        cout<<p->age;
        cout<<"    性别:";
        cout<<p->sex;
        cout<<"    专业:";
        cout<<p->spe;
        cout<<"    诊费:";
        cout<<p->fee;

        p=p->next;
        cout<<endl;
    }
}

int main()
{
    Doctor d;
    //d.add();
    d.open();
    d.show();
    //d.save();

    return 0;
}

qq423399099
qq423399099 你把head初始化。还不行的话文件发过来看一下
2 年多之前 回复
LEoe_
LEoe_   2016.04.18 14:33

图片说明

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
将文件读取到链表里面
/* * func.c * * Created on: 2012-12-8 * Author: wzm */ #include"head.h" void Init(pList mylist) { mylist->size=0; mylist->head.next=NULL; mylist->head.s=NULL; } int Create(pList mylist
C语言进阶——把文件内容读取到内存
编程思想 1、利用二级指针构建二维空间,这样做目的是为了节约内存空间。 2、分析图 下图是文件内容的抽象形式,现在要把蓝色部分的文字读取到内存 下图右边蓝色部分表示从文件读取出来的一行行内容,再过来绿色框的一级指针指向这些内容的地址,每个指针指向一行,然后再使用一个二级指针来指向这个一级指针数组 实现代码 //把文件读到内存 #include&amp;lt;stdio.h&amp;gt...
单链表及文件操作 从txt文件中读取数据并自动建立单链表
1、从文本文件中导入班级学生信息:学号、姓名、性别、籍贯 2、将学号重复的删除 3、显示导入的学生信息(文件加后缀) 4、按学号、姓名、性别、籍贯相等和不相等查找 5、多次查找 6、查找结果写入文件 7、VC++6.0编译通过
将文件中的内容写入链表
   在学校里,学过一点C,不过水平很低,现在学起来感觉很吃力,不过每天学会一点,还是挺开心的。编程这东西,写写,想想也就会了。   以下所有代码,均在Linux环境下,VIM编辑器中编写,通过GCC调试。   将文件中的内容写入链表的思路:  (1) 我们先要建立一个文件,示例中我采用了 stu_data.txt,创建一个文件指针FILE *fp指向该文件  (2)我们知道要将文件内容写入链表,其实非常类似与我们平时,将标准的输入输出写入链表。所以只要在文件的操作内,完成链表的建          立就好
用C实现将文件的内容读入内存
将文件的内容全部读入内存中。
文本文件字符串处理 MFC
1、 使用MFC图形界面;(15) 2、 对指定的文本文件进行读操作,将每一行字符串保存到一个动态空间中(可用地址指针数组或链表,也可用STL,这个随便),并显示出该文本文件的行数,最好是显示到一个编辑框中,也可以用提示框显示;(30) 3、 删除该文件(在其他地方备份,以便验收);(5) 4、 查找:设定一个编辑框,输入一个行数,并设定按钮,显示该行对应的字符串(最好用列表框,也可以用提示框)。(10) --------------------------------------------- 仅供参考
为何将文件名字读取到内存用链表存放,再从内存中读取信息输出到屏幕只显示一部分?
这次做的小项目是拷贝文件夹下所有文件到目标路径,并在读取源路径的同时将文件夹下所有文件的名字存放到链表中。 而我强无敌啊。用的是循环双向链表存放的数据。先上结构体: /* 用于存放文件信息 */ typedef struct FILE_STRU { unsigned char *name; /* 文件名字 */ struct FILE_STRU *prev, *next
读取文件内容存到数组的具体代码实现
//********************************************************// int edge_num = 1000; int spec = 1000; //表示行数 char * topo[1000];  //将topo赋给buff char ** const buff = topo;      //创建二位数组的形式     char *
C 按行读取文件到缓存,再打印
 #include &amp;lt;stdio.h&amp;gt;  2 #include &amp;lt;stdlib.h&amp;gt;  3 #include &amp;lt;string.h&amp;gt;  4   5 #define FILE_PATH &quot;/root/test_c/test.txt&quot;  6 #define STRING_LENGTH (20)  7 #define BUFF_LENGTH (1024 * 1024...
C语言-----循环双向链表(增加文件读写链表功能)
双向链表其实是单链表的改进。 当我们对单链表进行操作时,有时你要对某个结点的直接前驱进行操作时,又必须从表头开始查找。这是由单链表结点的结构所限制的。因为单链表每个结点只有一个存储直接后继结点地址的链域,那么能不能定义一个既有存储直接后继结点地址的链域,又有存储直接前驱结点地址的链域的这样一个双链域结点结构呢?这就是双向链表。 在双向链表中,结点除含有数据域外,还有两个链域,一个存储直接后继结