这是文件与之前的链表结合使用,可以从文件中看数据读出来,形成一条链表,同时也可以把链表的数据写入文件中

filedata头文件

/********************************************************
*              *
*  ☆☆☆☆☆文件读写 函数的声明 ☆☆☆☆☆  *
*              *
********************************************************/
#ifndef _FILEDATA_H_
#define _FILEDATA_H_

#include “list.h”

int FILE_write(int size,char *file,PNode head);

PNode FILE_find_all(int size,char *file); 

#endif _FILEDATA_H_

 

 

#include “filedata.h”
#include “list.h”
/*********************************************
*函数名称:int FILE_write(int size,char *file,PNode NodeHead)

*功能描述:对链表的内容全部写到对应的文件中

*参数说明:size [IN] 输入数据的大小
     file [IN] 写入到哪个文件
     NodeHead [IN]链表头结点

*返回值:  成功返回SUCCESS,失败返回FAILURE

*********************************************/
int FILE_write(int size,char *file,PNode NodeHead)
{

 FILE *pf;
 PNode tempnode=NULL;
 PNode curnode=NULL;
 tempnode=NodeHead;
 if ((pf=fopen(file,”wb+”))==NULL)
 {

  printf(“文件打开失败!\n”);
  return FAILURE;
 }

 if (0!=fclose(pf))
 {

  printf(“文件关闭失败!”);
  return FAILURE;
 }

 if ((pf=fopen(file,”ab+”))==NULL)
 {

  printf(“文件打开失败!\n”);
  return FAILURE;
 } 

 while(tempnode!=NULL)
 {

  if (tempnode->next!=NULL)       //判断下一个结点是否存在
  {

   curnode=tempnode->next;
  }
  else
  {

   curnode=NULL;
  }
  
  
  if (1!=fwrite(tempnode->data,size,1,pf))
  {

   printf(“数据写入失败!\n”);
   return FAILURE;
  }
  fflush(pf); //刷新缓冲区
  tempnode=curnode;
 }

 if (0!=fclose(pf))
 {

  printf(“文件关闭失败!”);
  return FAILURE;
 }

 return SUCCESS;
}

/*********************************************
*函数名称:PNode FILE_find_all(int size,char *file)

*功能描述:对链表的内容全部写到对应的文件中

*参数说明:size [IN] 输入数据的大小
     file [IN] 读哪个文件

*返回值:  成功返回头结点,失败返回NULL

*********************************************/
PNode FILE_find_all(int size,char *file)    //用于读取文件数据,并存储到链表到去
{

 int Inode=0;
 int Icount=0;
 void *data;
 FILE *pf;

 if ((pf=fopen(file,”rb+”))==NULL)
 {

  printf(“文件打开失败!\n”);
  return NULL;
 }

 data=(void*)malloc(size);              //给data分配空间,用于存放数据
 memset(data,0,size);

 while (0!=fread(data,size,1,pf))   
 {

  Icount++;
  if (Inode==0)
  {

   if ((NodeHead=List_init(data))==NULL)//对头结点进行初始化,如果失败就返回
    return NULL;

   Inode++;
  }
  else
  {

   if (List_add(data,NodeHead)==FAILURE)  //如果头结点初始化成功,就进行继续读取
   {

    printf(“添加数据失败\n”);
    return NodeHead;      //如果读取失败就,就返回
   }
  }
  data=(void*)malloc(size);                   //继续为下一个数据分配空间
  memset(data,0,size);  
 }

 free(data);          //释放最后一个没有使用的空间

 if (0!=fclose(pf))
 {

  printf(“文件关闭失败!”);
 }
 if (Icount==0)
 {

  return NULL;
 }
 return NodeHead;
}