C语言实现链表与文件的存取

   日期:2020-10-06     浏览:118    评论:0    
核心提示:作者:柠檬i,学习C时长两个月半的个人练习生

作者:柠檬i,学习C时长两个月半的个人练习生

第一次写文章,难免有些不足,请多多包涵。

本程序主要功能是建立链表,然后把链表数据存储到文件中,然后把文件数据存储到数组中并输出。

不多说了,放代码。

此处为main函数的内容

int main(void)
{ 
    char filename[50];
    printf("How many ?: ");
    scanf("%d", &n);		
    printf("please input filename: ");
    scanf("%s", filename);	
    Create();       //调用函数建立链表
    save(filename); //调用函数存到文件
    free(phead);//释放phead内存
    show(filename); //调用函数输出文件
    system("pause");
    return 0;
}

一、输入数据到链表中

建立链表并输入数据到链表里
代码如下:

typedef struct stu
{ 
    char name[20];
    char adr[20];
    int tel;
    struct stu* pnext;
} stu;
int i,n;	//i循环用,n存着信息条数
stu* phead=NULL;//phead为链表首地址

void Create()          //建立链表
{ 
    stu *pend,*pnew;//尾节点,新节点
    pend=phead =(stu*)malloc(sizeof(stu));//分配内存给首节点
    printf("please first input Name, Adress and telephone:\n");
    for(i=0;i<n;i++)
    { 
        pnew=(stu*)malloc(sizeof(stu));  //分配新节点
        pend->pnext=pnew;   //原来的尾节点指向新节点
        pnew->pnext=NULL;  	//新节点的指针为NULL
        printf("NO.%d: ",i+1);
        scanf("%s", pend->name);
        scanf("%s", pend->adr);
        scanf("%d",&pend->tel);
        pend=pnew;  //赋值后指向尾节点
    }
    pnew=pnew->pnext;//指向NULL
    free(pnew);      //释放pnew内存
}

二、把链表数据存入文件

此处用到了fopen、fprintf、fclose等文件操作函数

代码如下:

void save(char *filename)
{ 
    FILE *w;//文件指针
    if ((w = fopen(filename, "wb")) == NULL){    
        printf("cannot open file\n");
        exit(1);
    }
    for (i = 0; i < n; i++)  //链表数据循环输入到文件内
    { 
         fprintf(w,"%s ",phead->name);
         fprintf(w,"%s ",phead->adr);
         fprintf(w,"%d", phead->tel);
         fprintf(w,"%s","\r\n");//换行
         phead=phead->pnext;//指向下一个节点
    }
    fclose(w);	//关闭文件
}

三、输出文件

先把文件内容保存到结构体数组内,然后再通过数组输出到屏幕上。
代码如下:

void show(char *filename)		//输出文件
{ 
    FILE *fp;//文件指针
    stu info[100];  //负责存放文件中的数据,然后输出
    if ((fp = fopen(filename, "rb")) == NULL){    
        printf("cannot open file\n");
        exit(1);
    }
    for (i = 0; i < n; i++)
    { 
        fscanf(fp,"%s",&(info[i].name));//输出数据到数组
        fscanf(fp,"%s",&(info[i].adr));
        fscanf(fp,"%d",&(info[i].tel));
        printf("%10s%15s%15d\n", info[i].name,
        	info[i].adr, info[i].tel); //输出数据到屏幕
    }
    fclose(fp); //关闭文件
}        

以下为完整代码:


#include<stdio.h>
#include<stdlib.h>
#include<process.h>
typedef struct stu
{ 
    char name[20];
    char adr[20];
    int tel;
    struct stu* pnext;
} stu;
int i,n;	//i循环用,n存着信息条数
stu* phead=NULL;//phead为链表首地址

void Create()
{ 
    stu *pend,*pnew;//尾节点,新节点
    pend=phead =(stu*)malloc(sizeof(stu));//分配内存给首节点
    printf("please first input Name, Adress and telephone:\n");
    for(i=0;i<n;i++)
    { 
        pnew=(stu*)malloc(sizeof(stu));  //分配新节点
        pend->pnext=pnew;   //原来的尾节点指向新节点
        pnew->pnext=NULL;   //新节点的指针为NULL
        printf("NO.%d: ",i+1);
        scanf("%s", pend->name);//输入数据存到链表中
        scanf("%s", pend->adr);
        scanf("%d",&pend->tel);
        pend=pnew;  //赋值后指向尾节点
    }
    pnew=pnew->pnext;//指向NULL
    free(pnew);      //释放pnew内存
}
void save(char *filename)
{ 
    FILE *w;//文件指针
    if ((w = fopen(filename, "wb")) == NULL){    
        printf("cannot open file\n");
        exit(1);
    }
    for (i = 0; i < n; i++)  //链表数据循环输入到文件里
    { 
         fprintf(w,"%s ",phead->name);//数据存入到文件
         fprintf(w,"%s ",phead->adr);
         fprintf(w,"%d", phead->tel);
         fprintf(w,"%s","\r\n");//换行
         phead=phead->pnext;//指向下一个节点
    }
    fclose(w);	//关闭文件
}
void show(char *filename)
{ 
    FILE *fp;//文件指针
    stu info[100];  //负责存放文件中的数据,然后输出
    if ((fp = fopen(filename, "rb")) == NULL){    
        printf("cannot open file\n");
        exit(1);
    }
    for (i = 0; i < n; i++)
    { 
        fscanf(fp,"%s",&(info[i].name));//输出数据到数组
        fscanf(fp,"%s",&(info[i].adr));
        fscanf(fp,"%d",&(info[i].tel));
        printf("%10s%15s%15d\n", info[i].name, 
        	info[i].adr, info[i].tel);//输出数据到屏幕
    }
    fclose(fp);
}

int main(void)
{ 
    char filename[50];
    printf("How many ?:\n");
    scanf("%d", &n);		
    printf("please input filename: ");
    scanf("%s", filename); 
    Create();       //调用函数建立链表
    save(filename); //调用函数存到文件
    free(phead);//释放phead内存
    show(filename); //调用函数输出文件
    system("pause");
    return 0;
}

我尝试过fread和fwrite的做法,但都失败了。

参考文章:
c语言链表数据存入文件和读取文件

 
打赏
 本文转载自:网络 
所有权利归属于原作者,如文章来源标示错误或侵犯了您的权利请联系微信13520258486
更多>最近资讯中心
更多>最新资讯中心
0相关评论

推荐图文
推荐资讯中心
点击排行
最新信息
新手指南
采购商服务
供应商服务
交易安全
关注我们
手机网站:
新浪微博:
微信关注:

13520258486

周一至周五 9:00-18:00
(其他时间联系在线客服)

24小时在线客服