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"的文件,称为头文件,在前面的包含命令中我们已多次使用过.在& ...
随机推荐
- Solution Set -「ARC 109」
「ARC 109A」Hands Link. 讨论即可,除了煞笔出题人写了个死马的题面. #include<cstdio> #include<algorithm> using n ...
- Biwen.QuickApi代码生成器功能上线
[QuickApi("hello/world")] public class MyApi : BaseQuickApi<Req,Rsp>{} 使用方式 : dotnet ...
- 文心一言 VS 讯飞星火 VS chatgpt (107)-- 算法导论10.1 5题
五.用go语言,栈插入和删除元素只能在同一端进行,队列的插入操作和删除操作分别在两端进行,与它们不同的,有一种双端队列(deque),其插入和删除操作都可以在两端进行.写出4个时间均为 O(1)的过程 ...
- Flask框架——请求扩展、flask中间件、蓝图、分析线程和协程
文章目录 01 请求扩展 01 before_first_request :项目启动后第一次请求的时候执行 02 before_request:每次请求之前执行 03 after_request:每次 ...
- Elasticsearch 6.8.6
mac;centos;unix; 下载 wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.8.6. ...
- 循序渐进介绍基于CommunityToolkit.Mvvm 和HandyControl的WPF应用端开发(7) -- 图标列表展示和选择处理
我们在WPF应用端的界面中,使用lepoco/wpfui 来做主要的入口框架,这个项目它的菜单内置了不少图标,我们需要在动态菜单的配置中,使用它作为图标的展示处理,本篇随笔介绍如何基于图标枚举集合进行 ...
- .NET周刊【10月第2期 2023-10-08】
国内文章 起风了,NCC 云原生项目孵化计划 https://www.cnblogs.com/liuhaoyang/p/ncc-the-wind-rises.html 2016年,我和几位朋友发起了. ...
- Hyper-V 下的 Debian 双网卡配置
Debian 双网卡配置 因为 Hyper-v 不能在 Hyper-v Manger 里设置网卡的静态 IP, 而每次开机自启之后又要连接 Debian 虚拟机,所以使用了双网卡. 双网卡分为内网网卡 ...
- LINUX基础知识和命令 二
LINUX alias (别名) 自定义命令=原始命令 原始命令中有特殊符@#%()请打上 引号,单双无所谓 例:vim /etc/sysconfig/network-scripts/ifcfg-en ...
- CF1333A [Little Artem]
Problem 题目简述 给你一个 \(n \times m\) 的方格,构造一个方案,使得方案中 \(B = W + 1\). \(B\):相邻的格子有至少一个白色格子的黑色格子的个数. \(W\) ...