C语言实现链表与文件存取的示例代码

 更新时间:2022年04月25日 14:32:38   作者:CVE-柠檬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 n;	//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(int 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 (int 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 (int 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); //关闭文件
}        

完整代码

/*此代码为《C语言从入门到精通(第二版)》第十四章(文件)的【例14.7】的改进版*/
#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 n;	//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 (int 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 (int 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 (int 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语言实现链表与文件存取的示例代码的文章就介绍到这了,更多相关C语言链表与文件存取内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 函数指针的强制类型转换实现代码

    函数指针的强制类型转换实现代码

    函数指针的强制类型转换实现代码。需要的朋友可以过来参考下,希望对大家有所帮助
    2013-10-10
  • C++实现通讯录功能

    C++实现通讯录功能

    这篇文章主要为大家详细介绍了C++实现通讯录功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-06-06
  • C++实现LeetCode(347.前K个高频元素)

    C++实现LeetCode(347.前K个高频元素)

    这篇文章主要介绍了C++实现LeetCode(347.前K个高频元素),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08
  • C语言实现动态版通讯录的示例代码

    C语言实现动态版通讯录的示例代码

    这篇文章主要为大家详细介绍了如何利用C语言实现一个简单的动态版通讯录,文中的示例代码讲解详细,对我们学习C语言有一定帮助,需要的可以参考一下
    2022-08-08
  • C语言中static的使用介绍

    C语言中static的使用介绍

    大家好,本篇文章主要讲的是C语言中static的使用介绍,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览
    2021-12-12
  • c++ 指针与引用的区别介绍及使用说明

    c++ 指针与引用的区别介绍及使用说明

    指针与引用看上去完全不同(指针用操作符*和->,引用使用操作符.),但是它们似乎有相同的功能,感兴趣的朋友可以了解下啊,或许本文对你有所帮助,好了,话不多说,切入正题
    2013-01-01
  • C++实现LeetCode(163.缺失区间)

    C++实现LeetCode(163.缺失区间)

    这篇文章主要介绍了C++实现LeetCode(163.缺失区间),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-07-07
  • C语言枚举与联合图文梳理讲解

    C语言枚举与联合图文梳理讲解

    枚举顾名思义就是把所有的可能性列举出来,像一个星期分为七天我们就可以使用枚举,联合体是由关键字union和标签定义的,和枚举是一样的定义方式,不一样的是,一个联合体只有一块内存空间,什么意思呢,就相当于只开辟最大的变量的内存,其他的变量都在那个变量占据空间
    2023-01-01
  • C++使用ffmpeg实现rtsp取流的代码

    C++使用ffmpeg实现rtsp取流的代码

    这篇文章主要介绍了C++使用ffmpeg实现rtsp取流,文章介绍了ffmepg采用rtsp取流流程图,CMakeLists.txt编写方法,通过示例代码给大家介绍的非常详细,需要的朋友可以参考下
    2022-04-04
  • 让我们一起来对C语言指针再分析

    让我们一起来对C语言指针再分析

    这篇文章主要为大家详细介绍C语言的指针,本文进行了深度解析,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-01-01

最新评论