精华内容
下载资源
问答
  • 链表写好后,我们将链表写入文件中  fstream file1;  file1.open("int.txt");  file1 ;  将文件以读写的方式打开,记得要提前创建文件int.txt,因为以读写方式打开文件的时候,如果文件不存在,程序...
    就算世界荒芜,总有一个人,他会是你的信徒。          ----《独木舟里的星星》
    第一步:创建一个节点
    template < typename T >
    class Node
    {
    public:
         Node (T data)
        {
            m_data = data;
            m_pNext = NULL ;
        }

         const T & getData ()
        {
             return m_data;
        }

        Node < T > * & getNext ()
        {
             return m_pNext;
        }
    private:
        T m_data;
        Node * m_pNext;
    };
         这里用到了类模板,因为这里的数据部分类型无法确定。


    第二步:创建链表
    template < typename T >
    class List
    {
    public:
         List ()
        {
            m_iLen = 0 ;
            m_pFirstNode = NULL ;
        }

        Node < T >* getFirstNode ()
        {
             return m_pFirstNode;
        }

         int getListLen ()
        {
             return m_iLen;
        }

         void insert (T data)
        {
            Node < T > * node = new Node < T > (data);
            node-> getNext () = m_pFirstNode;
            m_pFirstNode = node;
            m_iLen ++ ;
        }

         void display ()
        {
            Node < T > * tmp = m_pFirstNode;
             for ( int i = 0 ; i < m_iLen; i ++ )
            {
                cout << tmp-> getData () << endl;
                tmp = tmp-> getNext ();
            }
        }

    private:
         int m_iLen;
        Node < T > * m_pFirstNode;
    };
           一般习惯将链表头定义的与其他节点不同,链表头可以放很多信息,例如:链表长度、作者、修改人、创建日期等等,当后面节点加入的时候不会每个节点都有这些信息。


    。。。可以在主函数中试一下链表。。。
    int main(void)
    {
        List<int> intList;
        intList.insert(2);
        intList.insert(1);
        intList.insert(5);
        intList.insert(3);
        intList.insert(4);
        cout << "打印链表" << endl;
        intList.display();


    第四步: 链表写好后,我们将链表写入文件中
            fstream file1;
            file1.open("int.txt");
            file1 << intList;
            将文件以读写的方式打开,记得要提前创建文件int.txt,因为以读写方式打开文件的时候,如果文件不存在,程序不会自动创建。同样,以只读打开也是一样,只有以只写打开的时候才会自动创建。如果仅仅这样写,编译的时候肯定 无法通过 ,因为无法将一个链表类型的数据直接写入文件。我们需要将 <<运算符重载。
    重载运算符: <<
    template<typename T>
    fstream &operator << (fstream &file, List<T> &list)
    {
        Node<T> *tmp = list.getFirstNode();
        int len = list.getListLen();
        for(int i = 0; i < len; i++)
        {
            file << tmp->getData();
            tmp = tmp->getNext();
        }
        return file;
    }
    写完后,再执行file1.intList; 就不会报错了。


    第五步:从文件中读取数据到链表
        file1.seekg(0, ios_base::beg);
        cout << "--------读取文件里的链表------------" << endl;
        List<int> intList2;
        int data = 0;
        while(1)
        {
            file1 >> data;
            intList2.insert(data);
            if(file1.eof())
            {
                break;
            }
        }
        intList2.display();
        file1.close();
    思路很简单,首先将文件的读写位置设置到首部,因为我们在写入文件的时候,读写位置到了最后,这时候直接读是读不到数据的。然后将文件里的内容读到临时变量data中,然后插入的时候调用有参构造函数,输入参数data,生成新链表。读取完退出,最后打印显示。



    上面的链表只针对一般的数据类型有效,如果我们的数据部分是自己构造的类呢?
    第一步:创建一个类(以student为例)
    class Student
    {
    public:
         Student ( int id = 1000 , string name = " " , float score = 0.0f )
        {
            m_iId = id;
            m_strName = name;
            m_fScore = score;
        }

         friend ostream & operator << (ostream & out, const Student & stu);

    private:
         int m_iId;
        string m_strName;
         float m_fScore;
    };


    第二步:重载运算符 <<
    ostream & operator << (ostream & out, const Student & stu)
    {
        out << " " << stu. m_iId << " " << stu. m_strName << " " << stu. m_fScore ;
    }
    这里重载是因为1、打印的时候无法直接直接输入一个Student类型,即:cout << stu 是无法直接实现的, 2、写入文件的时候同样无法直接写入一个Student类型。但为什么只重载ostream中的<<就可以同时实现两个呢?因为fstream继承了iostream,而iostream又继承了istream和ostream。关系如下图:


    这之后的操作大同小异,大家可以自行理解。
    下面是全代码,以及打印结果:

    #include <iostream>
    #include <fstream>
    using namespace std ;

    class Student
    {
    public:
         Student ( int id = 1000 , string name = " " , float score = 0.0f )
        {
            m_iId = id;
            m_strName = name;
            m_fScore = score;
        }

         friend ostream & operator << (ostream & out, const Student & stu);
         //friend fstream &operator << (fstream &file, const Student &stu);
    private:
         int m_iId;
        string m_strName;
         float m_fScore;
    };

    ostream & operator << (ostream & out, const Student & stu)
    {
        out << " " << stu. m_iId << " " << stu. m_strName << " " << stu. m_fScore ;
    }

    template < typename T >
    class Node
    {
    public:
         Node (T data)
        {
            m_data = data;
            m_pNext = NULL ;
        }

         const T & getData ()
        {
             return m_data;
        }

        Node < T > * & getNext ()
        {
             return m_pNext;
        }
    private:
        T m_data;
        Node * m_pNext;
    };


    template < typename T >
    class List
    {
    public:
         List ()
        {
            m_iLen = 0 ;
            m_pFirstNode = NULL ;
        }

        Node < T >* getFirstNode ()
        {
             return m_pFirstNode;
        }

         int getListLen ()
        {
             return m_iLen;
        }

         void insert (T data)
        {
            Node < T > * node = new Node < T > (data);
            node-> getNext () = m_pFirstNode;
            m_pFirstNode = node;
            m_iLen ++ ;
        }

         void display ()
        {
            Node < T > * tmp = m_pFirstNode;
             for ( int i = 0 ; i < m_iLen; i ++ )
            {
                cout << tmp-> getData () << endl;
                tmp = tmp-> getNext ();
            }
        }
        
    private:
         int m_iLen;
        Node < T > * m_pFirstNode;
    };

    template < typename T >
    fstream & operator << (fstream & file, List < T > & list)
    {
        Node < T > * tmp = list. getFirstNode ();
         int len = list. getListLen ();
         for ( int i = 0 ; i < len; i ++ )
        {
            file << tmp-> getData ();
            tmp = tmp-> getNext ();
        }
         return file;
    }


    int main ( void )
    {
        List < int > intList;
        intList. insert ( 2 );
        intList. insert ( 1 );
        intList. insert ( 5 );
        intList. insert ( 3 );
        intList. insert ( 4 );
        cout << "打印链表" << endl;
        intList. display ();

        fstream file1;
        file1. open ( "int.txt" );
        file1 << intList;
        file1. seekg ( 0 , ios_base::beg);
        cout << "--------读取文件里的链表------------" << endl;
        List < int > intList2;
         int data = 0 ;
         while ( 1 )
        {
            file1 >> data;
            intList2. insert (data);
             if (file1. eof ())
            {
                 break ;
            }
        }
        intList2. display ();
        file1. close ();

        cout << endl << endl;
        List < Student > stuList;
        stuList. insert ( Student ( 1001 , "aa" , 23 ));
        stuList. insert ( Student ( 1002 , "bb" , 14 ));
        stuList. insert ( Student ( 1003 , "cc" , 53 ));
        stuList. insert ( Student ( 1004 , "dd" , 25 ));
        stuList. insert ( Student ( 1005 , "ee" , 94 ));
        cout << "打印链表" << endl;
        stuList. display ();

        fstream file2;
        file2. open ( "student.txt" );
        file2 << stuList;
        file2. seekg ( 0 , ios_base::beg);
        cout << "-------读取文件里的链表------------" << endl;
        List < Student > stuList2;
         int id = 0 ;
        string name = " " ;
         float score = 0.0f ;
         while ( 1 )
        {
            name. clear ();
            file2 >> id >> name >> score;
            stuList2. insert ( Student (id, name, score));
             if (file2. eof ())
            {
                 break ;
            }
        }
        stuList2. display ();
        file2. close ();

         return 0 ;
    }





    QQ:1786610699      倔强的木木      2017年8月26日
    展开全文
  • 链表写入文件 */ void srcj ( listlink head ) { if ( head == NULL ) return ; listlink p = head -> next ; FILE * fp ; if ( ( fp = fopen ( "fle.txt" , "wt" ) ) == NULL...

    寻开心大哥写的

    在这里插入代码片
    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    struct cj {
     char xh[10];
     char name[10];
     int gs;
     int cx;
     struct cj *next;
    };
    typedef struct cj jj,*listlink;
    void srcj(listlink head);
    void prin(listlink head);
    void append(listlink head);
    void display(listlink head);
    int main(void) 
    {
     int n;
     listlink head;
     head = (listlink)malloc(sizeof(jj));
     head->next = NULL;
     while(1) 
     {
      printf("0:Quit 1: 从文件读 2:写入文件  3:添加:");
      scanf("%d",&n);
      switch (n) 
      {
       case 2:
        printf("把数据写入到fle.txt文件昂中\n");
        srcj(head);
        break;
       case 1:
        printf("从fle.txt文件当中读取数据\n");
        prin(head);
        break;
       case 3:
        append(head);
        break;
       case 0:
        return 0;
        break;
       case 4:
        display(head);
        break;
      }
     };
     return 0;
    }
    /*
    把链表写入文件
    */
    void srcj(listlink head)
    {
     if ( head == NULL ) return;
     listlink p = head->next;
     FILE *fp;
     if( (fp=fopen("fle.txt","wt") )== NULL) 
     {
      printf("打开写入文件fle.txt失败\n");
      return;
     }
     while(p) 
     {
      fprintf(fp,"%s %s %d %d\n",p->xh, p->name, p->gs, p->cx);
      p = p->next;
     }
     fclose(fp);
    }
    /*
    从文件读取内容
    */
    void prin(listlink head)
    {
     if ( NULL == head) return;
     FILE *fp;
     listlink p = head;
     if((fp=fopen("fle.txt","r")) == NULL)
     {
      printf("打开fle.txt文件失败\n");
      return ;
     }
     while(1)
     {
      listlink q = (listlink)malloc(sizeof(jj));
      int nRead = fscanf(fp,"%s%s%d%d",q->xh,q->name, &q->gs,&q->cx);
      if ( 4 == nRead ) 
      {
       printf("%s\t%s\t%d\t%d\n",q->xh,q->name,q->gs,q->cx);
       p->next = q;
       p = q;
      }
      else 
      {
       free(q);
       break;
      }
     }
     p->next = NULL;
     fclose(fp);
    }
    void append(listlink  head) 
    {
     if ( NULL == head) return;
     listlink q = head;
     while(q->next ) q=q->next;
     listlink p = (listlink) malloc(sizeof(jj));
     printf("input data\n");
     scanf("%s%s%d%d", p->xh, p->name, &p->gs, &p->cx);
     q->next = p;
     p->next = NULL;
    }
    void display(listlink head) 
    {
     if ( NULL == head ) return;
     listlink p = head->next;
     while (p) 
     {
      printf("%s\t%s\t%d\t%d\n", p->xh, p->name, p->gs, p->cx);
      p=p->next;
     }
    }
    展开全文
  • struct Txl ... printf("不能打开文件"); return; } for(i=0;i;i++) { if(fwrite(p,LEN,1,fp)!=1) { printf("写入失败"); } p=p->next; } fclose(fp); } void main(){...}
  • 用c语言这一个双向链表,然后用fwrite写入文件,用fread读取,这个过程和单链表是一样的吗?
  • 转载自 wuhuang040924 ...先附上一份文件读写操作:(今天一天头都晕,快成猪脑子了^_^) ... 返回值:成功返回写入文件的字节数,失败返回-1 write函数向filedes文件中写入nbytes字节数据,数

    转载自  wuhuang040924

    先附上一份文件读写操作:(今天一天头都晕,快成猪脑子了^_^)


    //写函数,
    #include<unistd.h>
    ssize_t write(int fd,const void *buf,size_t nbytes));
          返回值:成功返回写入文件的字节数,失败返回-1
    write函数向filedes文件中写入nbytes字节数据,数据来源为buf.


    ssize_t read(int fd,const void *buf,size_t nbytes);
         返回值:成功返回写入的字节数,0则碰到EOF。失败返回-1
    read函数从filedes文件中读取nbytes字节数据,存放于buf中。


    #include<fcntl.h>
       int open(const char *pathname,int oflag,mode_t mode)
         返回文件句柄
       第一个参数是待打开/创建的文件的路径名;oflag用于指定文件的打开/创建模式,这个参数可由以下常量通过逻辑构成。
          O_RDONLY      只读模式 YcWLinux联盟
          O_WRONLY      只写模式 YcWLinux联盟
          O_RDWR        读写模式YcWLinux联盟
       打开/创建文件时,至少得使用上述三个中的一个,搭配下面:
          O_APPEND       每次写操作都写入文件的末尾 YcWLinux联盟
          O_CREAT        如果指定文件不存在,则创建这个文件 YcWLinux联盟
          O_EXCL         如果要创建的文件已存在,则返回 -1,并且修改 errno 的值YcWLinux联盟
          O_TRUNC        如果文件存在,并且以只写/读写方式打开,则清空文件全部内容 YcWLinux联盟
          O_NOCTTY       如果路径名指向终端设备,不要把这个设备用作控制终端。YcWLinux联盟
          O_NONBLOCK     如果路径名指向 FIFO/块文件/字符文件,则把文件的打开和后继 I/OYcWLinux联盟
                           设置为非阻塞模式(nonblocking mode)

    #include<stdio.h>
    #include<stdlib.h>
    #include<fcntl.h>
    #define N 10
    typedef struct node
    {
    char name[20];
    struct node *next;
    }stud;

    //将链表写入文件


    stud * create(int n)
    {
    stud *p,*h,*s;
    int i;
    h=NULL;   //经常忘记定义这里,导致下面执行Segment fault!!
    for(i=0;i<n;i++)
    {
        if((s=(stud *)malloc(sizeof(stud)))==NULL)
        {
          printf("malloc space failed!\n");
          exit(0);

         }
       if(h==NULL)
         h=s;
       else
         p->next=s;
       printf("please enter name:");
       scanf("%s",s->name);
       p=s; 
        }
    s->next=NULL;
       return h;
    }

    void print(stud * head)
    {
       while(head)
       {
          printf("name:%s\n",head->name);
          head=head->next;

        }

    }

    //从文件中读出链表
    stud * read_userman()
    {
       int fd,usersize,rc;
       stud *p1,*p2;
       stud temp;
       static stud head;
       usersize=sizeof(stud);
       fd=open("/tmp/user.txt",O_CREAT|O_RDONLY);
       if(fd<0)
          return;
       rc=read(fd,&temp,usersize);
       p1=&head;
       while(rc>0)
       {
         p1->next=(stud *)malloc(usersize);
         memcpy(p1->next,&temp,usersize); 
          p1=p1->next;
          p1->next=NULL;
          memset(&temp,0,usersize);
          rc=read(fd,&temp,usersize);          
       }
    close(fd);
    if(p1==&head)
         return NULL;
    return head.next;
    }

    int main()
    {
       stud *head;
       head=create(N);
       print(head);
       write_username(head);
        head=read_userman();
        print(head);
        return 0;
    }

    //当频繁读取链表时,会引起程序错误。下面程序为一删除N个数据,原来做法为删一个写入文件,删一个写入文件,频繁操作,会引起程序进程死亡。所以做法改为 一次删除N个数据,都是在内存中进行,直到删除完全部数据,再写回文件。这样就不会引起进程的死亡了。

    int delete_sslclient_userman_memonry()
    {
    struct sslclient_userman first_userman,*userman,*pre_userman;
    FILE *fp;
    char usernum[10];
    int id;
       userman=read_sslclient_userman_conf();
    first_userman.next=userman;
    pre_userman=&first_userman;

    fp=fopen("/tmp/user.txt","r");
    while(1)
    {
            if(fgets(usernum,10,fp)==NULL)
            break;
             id=atoi(usernum);
            while((userman->user_num!=id)&&(userman->next!=NULL)){
       pre_userman=userman;
       userman=userman->next;
       } 

    if (userman->next==NULL)
       {
       pre_userman->next=NULL;
            write_sslclient_userman_conf(first_userman.next);
            return 1;
       }
    else
       {
       pre_userman->next=userman->next;
       }

    userman=first_userman.next;
    }
    write_sslclient_userman_conf(first_userman.next);

    return 0;
    }

    展开全文
  • # include   struct student {  int age;  char name[50];  struct student * next; }; int main(void) {  return 0; }   给一小段代码就好,文件写入和读出,拜托了

    # include <stdio.h>

     

    struct student

    {

       int age;

       char name[50];

       struct student * next;

    };

    int main(void)

    {

        return 0;

    }

     

    给一小段代码就好,文件写入和读出,拜托了

    展开全文
  • 1 转载于:https://www.cnblogs.com/ZhuLuoJiGongYuan/p/9544365.html
  • 1 转载于:https://www.cnblogs.com/ZhuLuoJiGongYuan/p/9537821.html
  • 待补 转载于:https://www.cnblogs.com/ZhuLuoJiGongYuan/p/9571219.html
  • c语言数据从链表写入文件和从文件读取到链表

    千次阅读 多人点赞 2020-03-07 14:03:28
    想要实现c语言数据从链表写入文件和从文件读取到链表这个功能必须 先得了解一些关于文件操作的一些函数 fopen() fclose() fprintf() fscanf() fread() fwrite() 这些都会再我的另外一篇博客中提到 这个代码仅仅是...
  • 已结贴√问题点数:20回复次数:12 如何将链表文件 fwrite()写入或 fread()读出? 请各位牛人异士。多多指教。。。fwrite(pstu,sizeof(struct student),1,fp);//向 fp 所指向的文件 stud 写入数据(输出)。fread...
  • 读取出来.shp文件的数据后保存在一个链表中,如何将链表内容写入文件
  • 在写一个通讯录管理系统,然后要把联系人的信息结构体放到链表中,然后将链表里的信息写入文件中,下次打开时还能从该文件读出数据。 链表头指针TEL,结构体中有name,tel,style,mail 四项,存入“telephone.txt"中。...
  • 求高手指导,用javaio流怎么实现链表写入和读出文件夹,不知道怎么结合链表和流
  • 这几天学了文件处理相关的知识,这里用这个例子来结合理解链表文件处理。 要求:程序运行起来,检测是否存在目标文件,如果存在,读取文件内容,并保存在链表中,再一 一输出,输出结束问是否要更新文件,支持数据...
  • 文章目录头文件菜单主函数文件数据以链表方式读出链表写入文件新建联系人查看所有联系人查找指定联系人修改联系人删除联系人 头文件 首先写一个通讯录的头文件 contacts.h #include <iostream> #include <...
  • #include #include #include #include ...int sum(node *head) //求链表中有多少联系人 ... void write_to_file(node *head,int len) //链表中的联系人信息写到文件 {  int i;  str string[100...
  • 这是我自己实现的,有问题不懂的可以问我哦!嘿嘿 注意,这是在Eclipse下写的,也可以在终端下打开,不过得是LINUX系统下
  • C链表使用fread和fwrite写入文件和从文件读出 具体代码如下 //结构类型 typedef struct Lnode { ElemType data; struct Lnode *next; }Lnode, *Linknode; //写文件的方法 status SaveList(Linknode &amp;L) ...
  • /*c语言将数据写入文件,用链表实现*/ #include #include #include /*定义结构体*/ typedef struct Node { char id[10]; /*学生学号*/ char name[20]; /*学生姓名*/ struct Node
  • C语言文件读取并写入链表

    万次阅读 多人点赞 2018-09-24 17:11:06
    C语言没啥要逼逼的,直接上代码,用心体会 #include "stdio.h" #include "stdlib.h" ... 链表节点结构体 ****************************/ typedef struct link_node { int ID; char name; int Yuwen; int ...
  • 链表读写文件

    千次阅读 2020-04-16 19:24:33
    将学生信息先以链表的形式存储在内存中,然后再写入文件里,需要读取学生信息时,将稳健的内容读取到链表里,然后在屏幕上显示。 // ConsoleApplication1.cpp: 定义控制台应用程序的入口点。 // #include "stdafx...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 70,415
精华内容 28,166
关键字:

链表写入文件