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 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语言实现链表与文件的存取的更多相关文章
- c语言实现链表增、删、改、查及文件读写 && 链表实现程序
一.链表实现增删改查 1.链表定义 1 #include<stdio.h> 2 #include<string.h> 3 #include<windows.h> 4 ...
- C语言应用操作之文件
文件是C语言中德中的重点,小编在学习C语言基础知识的时候,大多数的输入输出操作是在屏幕上进行的,现在总算在文件学习上感觉到高大上的样纸.在以前数据量很小时,我们通常将信息从键盘在屏幕上进行输入输出的, ...
- 17.3.15---C语言详解FILE文件操作
FILE 是 C语言文件结构定义, 打开文件和文件操作要用到这类结构.可以看成变量类型,用于变量声明.这个是一种数据结构类型,用来表示一个文件的相关信息,如果定义了一个文件指针,就用这个指针来指向某个 ...
- C语言之链表
这两天在复习C语言的知识,为了给下个阶段学习OC做准备,以下的代码的编译运行环境是Xcode5.0版本,写篇博文把昨天复习的C语言有关链表的知识给大家分享一下,以下是小菜自己总结的内容,代码也是按照自 ...
- 【转载】 Pyqt 利用QDataStream对文件进行存取
# -*- coding: utf-8 -*- from PyQt4.QtGui import * from PyQt4.QtCore import * import sys QTextCodec.s ...
- Swift3.0语言教程字符串与文件的数据转换
Swift3.0语言教程字符串与文件的数据转换 Swift3.0语言教程字符串与文件的数据转换,如果想要对字符串中的字符进行永久保存,可以将字符串中的字符写入到文件中.当然,开发者也可以将写入的内容进 ...
- Linux C 单链表 读取文件 并排序 实例并解释
C的指针挺头疼的,先看一个例子: 给指针赋值和通过指针进行赋值这两种操作的差别确实让人费解.谨记区分的重要方法是:如果对左操作数进行解引用,则修改的是指针所指对象的值: 如果没有使用解引用操作, ...
- SQLLite 可以通过SQL语言来访问的文件型SQL数据库
Web Storage分为两类: - sessionStorage:数据保存在session 对象中(临时) - localStorage:数据保存在本地硬件设备中(永久) sessionStorag ...
- JAVA调用C语言写的SO文件
JAVA调用C语言写的SO文件 因为工作需要写一份SO文件,作为手机硬件IC读卡和APK交互的桥梁,也就是中间件,看了网上有说到JNI接口技术实现,这里转载了一个实例 // 用JNI实现 // 实例: ...
- C语言常用的库文件(头文件、函数库)
C语言常用的库文件(头文件.函数库) C系统提供了丰富的系统文件,称为库文件.C的库文件分为两类,一类是扩展名为".h"的文件,称为头文件,在前面的包含命令中我们已多次使用过.在& ...
随机推荐
- MySQL实战实战系列 04 深入浅出索引(下)
在上一篇文章中,我和你介绍了 InnoDB 索引的数据结构模型,今天我们再继续聊聊跟 MySQL 索引有关的概念. 在开始这篇文章之前,我们先来看一下这个问题: 在下面这个表 T 中,如果我执行 se ...
- RPM软件包:Red HatPackage Manager,RPM
RPM软件包是按照GPL条款发行在各个linux版本上使用. 用途 可以安装.删除.升级.刷新和管理RPM软件包 通过RPM软件包管理能知道软件包包含哪些文件,也能知道系统中的某个文件属于哪个RPM软 ...
- Go语言代码断行规则详解
本文深入探讨了Go语言中代码断行的各个方面,从基础概念到实际应用实践. 关注[TechLeadCloud],分享互联网架构.云服务技术的全维度知识.作者拥有10+年互联网服务架构.AI产品研发经验.团 ...
- Gitlab仓库代码更新时Jenkins自动构建
环境说明 1.Jenkins和gitlab已经都已经安装完毕 2.Jenkins能连接到gitlab获取项目并能手动创建项目 3.Jenkins和gitlab能相互访问的到(gitlab要能连接到Je ...
- Unity - UIWidgets 2. 控件组合
UIWidgets没有提供完整文档, 称可以去看Flutter的文档 中文 \ 英文 控件(Control)在Flutter中称为"Widget", 一个界面的若干控件是通过wid ...
- 一步步带你剖析Java中的Reader类
本文分享自华为云社区<深入理解Java中的Reader类:一步步剖析>,作者:bug菌. 前言 在Java开发过程中,我们经常需要读取文件中的数据,而数据的读取需要一个合适的类进行处理.J ...
- Web SSH 的原理与在 ASP.NET Core SignalR 中的实现
前言 有个项目,需要在前端有个管理终端可以 SSH 到主控机的终端,如果不考虑用户使用 vim 等需要在控制台内现实界面的软件的话,其实使用 Process 类型去启动相应程序就够了.而这次的需求则需 ...
- Visual Studio vs2010到2022各个版本的的永久激活密钥
前言 以下密钥均收集于网络,但均可以正常激活 VS2022专业版和企业版的密钥 Visual Studio 2022 Pro(专业版) TD244-P4NB7-YQ6XK-Y8MMM-YWV2J Vi ...
- mysql 代码适配 postgresql 适配改写,优化案例(行转列 + 标量子查询改写)
最近在适配个MySQL应用的项目,各种SQL改成PG兼容的语法真的是脑壳痛,今天遇到个有意思的案例. 原 MySQL SQL语句: SELECT DISTINCT l.MALL_NAME '项目', ...
- postgresql 去重计数改写案例
最近帮忙在搞一个内网报表系统的项目,里面的逻辑比较复杂,很多视图套视图的语句. 最多的一个视图除了它本身以外,一层层嵌套了7个视图在里面,贼恶心. SQL遇到性能问题只能每一层视图捋清对象关系来排查缓 ...