C语言下的文件详解
主要内容
- 文件概述
- 文件指针
- 文件的打开与关闭
- 文件的读写
文件
把输入和输出的数据以文件的形式保存在计算机的外存储器上,可以确保数据能随时使用,避免反复输入和读取数据
文件概述
- 文件是指一组相关数据的有序集合
- 文件是存储数据的基本单位,可以通过读取文件访问数据。
分类
C语言文件分类
缓冲文件系统

非缓冲文件系统
文件输入输出函数
文件指针
typedef struct
{ int level; //缓冲区“满”或“空”的标志unsigned flags; //文件状态标志char fd; //文件描述unsigned char hold; //如果没有缓冲区则不读取字符int bsize; //缓冲区大小unsigned char _FAR *buffer; //缓冲区位置unsigned char _FAR *curp; //指向缓冲区当前数据的指针unsigned istemp; //临时文件指示器short token; //用于有效性检查
}FILE;
文件的打开与关闭
fopen函数
FILE *fp;
//fp是一个指向FILE结构体类型的指针变量
fp = fopen("file_data.txt","r");
//以只读方式打开文件file_data.txt

fopen函数,会由于无法打开指定文件而出现错误。
如果出错,fopen函数会返回一个空指针值NULL(NULL在stdio.h中被定义为0)。
例如以“r”方式打开时,文件不存在,要进行错误处理。
FILE *fp;
if( (fp = fopen("file_data.txt","r") ) == NULL )
{ printf("can not open the file\n");
exit(0);
}
fclose函数
文件的读写
fputc函数
【例13.1】从键盘输入文本,并将文本写入磁盘上存储的文本文件file_data.txt中。以字符#作为输入结束标志。
分析:
首先打开文件,然后从键盘循环输入字符,如果字符不是结束标志“#”,那么将字符写入文件,否则关闭文件
#include<stdio.h>
#include<stdlib.h>
void main()
{ FILE *fp;char ch;if( (fp = fopen("file_data.txt","w")) == NULL ) //打开文件{ printf("can not open the file\n");exit(0); //退出程序,必须包含<stdlib.h>头文件}ch = getchar();while(ch != '#' ){ fputc(ch,fp); //输出字符ch = getchar();}fclose(fp); //关闭文件
}
fgetc函数
【例13.2】读取文本文件file_data.txt,并将文件中的内容输出到屏幕上。
分析:
首先打开文件,然后反复从文件中读入一个字符,并输出到屏幕,直到文件的结尾,最后关闭文件。
#include<stdio.h>
#include<stdlib.h>
void main()
{ FILE *fp;char ch;if( (fp = fopen("file_data.txt","r")) == NULL ) //打开文件{ printf("can not open the file\n");exit(0); //退出程序}ch = fgetc(fp); //从文件中读入一个字符while(ch != EOF ){ putchar(ch);ch = fgetc(fp); //从文件中读入一个字符}fclose(fp); //关闭文件
}
fputs函数
【例13.3】从键盘输入一串字符串,并将字符串写入文本文件file_data.txt中。
解决该问题的主要步骤为:
(1)打开文本文件file_data.txt。
(2)从键盘输入一串字符串。
(3)将字符串写入文件中。
(5)关闭文件。
(6)结束程序。
#include<stdio.h>
#include<stdlib.h>
void main()
{ FILE *fp;char str[20];if( (fp = fopen("file_data.txt","w")) == NULL ){ printf("can not open the file\n");exit(0);}printf("input the string: ");gets(str);fputs(str,fp); //写入字符串fclose(fp);
}
fgets函数
【例13.4】读取文本文件file_data.txt中指定长度的文本,长度由键盘输入,并将读取的内容输出到屏幕上。
解决该问题的主要步骤为:
(1)打开文本文件file_data.txt。
(2)从键盘输入要读取的文本长度。
(3)读入数据。
(4)输出数据。
(5)关闭文件。
(6)结束程序。
#include<stdio.h>
#include<stdlib.h>
void main()
{ FILE *fp;char str[20];int n;if( (fp = fopen("file_data.txt","r")) == NULL ){ printf("can not open the file\n");exit(0);}printf("input the character's number: ");scanf("%d",&n);fgets(str,n+1,fp);printf("%s\n",str);fclose(fp);
}
fprintf函数
【例13.5】将指定数据写入文本文件file_data.txt中。
编写程序如下:
#include<stdio.h>
#include<stdlib.h>
void main()
{ FILE *fp;int i=10,j=12; double m=1.5,n=2.345; char s[]="this is a string"; char c='\n'; if( (fp = fopen("file_data.txt","w")) == NULL ){ printf("can not open the file\n");exit(0);}fprintf(fp,"%s%c",s,c); fprintf(fp,"%d %d\n",i,j); fprintf(fp,"%lf %lf\n",m,n); fclose(fp);
}
文件中保存的文本与程序中的数据一致,且格式与指定格式相同
【例13.6】按照每行5个数,将Fibonacci数列的前40个数写入file_data.txt文件中。
编写程序如下:
#include<stdio.h>
#include<stdlib.h>
void main()
{ FILE *fp;int f[40];int i;if( (fp = fopen("file_data.txt","w")) == NULL ){ printf("can not open the file\n");exit(0);}for (i=0;i<=39;i++) //求Fibonacci数列{ if (i==0||i==1) f[i]=1;elsef[i]=f[i-2]+f[i-1];}for (i=0;i<=39;i++) //写入文件{ if ((i+1)%5==0)fprintf(fp,"%10d\n",f[i]); elsefprintf(fp,"%10d",f[i]); }fclose(fp);
}
fscanf函数
【例13.7】以指定格式读取【例13.5】中生成的文件file_data.txt中的数据,并输出到屏幕上
编写程序如下:
#include<stdio.h>#include<stdlib.h>void main(){ FILE *fp;int i,j; double m,n; char s1[100],s2[100],s3[100],s4[100]; if( (fp = fopen("file_data.txt","r")) == NULL ){ printf("can not open the file\n");exit(0);}fscanf(fp,"%s%s%s%s",s1,s2,s3,s4); //读入四个单词fscanf(fp,"%d%d",&i,&j);//读入两个整型数据 fscanf(fp,"%lf%lf",&m,&n); //读入两个double类型数据printf("%s %s %s %s\n",s1,s2,s3,s4); printf("%d %d\n",i,j); printf("%lf %lf\n",m,n);fclose(fp);}
fwrite函数
struct Book_Type
{ char name[10];//书名int price;//价格char author[10];//作者名
};
for(i=0;i<2;i++)
{fwrite(&book[i],sizeof(struct Book_Type),1,fp);
}
【例13.8】通过键盘输入所有2本书的信息,并存储在文本文件file_data.txt中。
编写程序如下:
#include<stdio.h>#include<stdlib.h>void main(){ struct Book_Type{ char name[10];//书名int price;//价格char author[10];//作者名};FILE *fp;struct Book_Type book[2];int i;if( (fp = fopen("file_data.txt","wb")) == NULL ){ printf("can not open the file\n");exit(0);}printf("input the book info: \n");for(i=0;i<2;i++){ scanf("%s%d%s",book[i].name,&book[i].price,book[i].author); fwrite(&book[i],sizeof(struct Book_Type),1,fp); //读入一条记录}fclose(fp);}
因为是以二进制方式保存,所以记事本中的内容显示为乱码。
fread函数
【例13.9】将【例13.8】中已经存有book信息的文件打开,读出信息后显示在屏幕上。
编写程序如下:
#include<stdio.h>#include<stdlib.h>void main(){ struct Book_Type{ char name[10];//书名int price;//价格char author[10];//作者名};FILE *fp;struct Book_Type book[2];int i;if( (fp = fopen("file_data.txt","rb")) == NULL ){ printf("can not open the file\n");exit(0);}printf("the book info: \n"); for(i=0;i<2;i++)fread(&book[i],sizeof(struct Book_Type),1,fp);for(i=0;i<2;i++)printf("name=%s,price=%d,author=%s\n",book[i].name,book[i].price,book[i].author);fclose(fp);}
rewind函数
【例13.10】将指定字符串数据写入文本文件file_data.txt中,并将文件的位置指针重新定位到文件开头,读出文件中的第1个字符数据后显示在屏幕上。
编写程序如下:
#include<stdio.h>#include<stdlib.h>void main(){ FILE *fp; char s[]="abcdefghijklmnopqrstuvwxyz";char c;if( (fp = fopen("file_data.txt","w+")) == NULL ){ printf("can not open the file\n");exit(0);}fprintf(fp,"%s",s); //向文件中写入字符串rewind(fp); //指针返回开始fscanf(fp,"%c",&c); //读入一个字符printf("The first character is: %c\n",c);fclose(fp);}
fseek函数
【例13.11】将指定字符串数据写入文本文件file_data.txt中,并将文件的位置指针定位到第5个字符之后,读出第6个字符并显示在屏幕上。
编写程序如下:
#include<stdio.h>#include<stdlib.h>void main(){ FILE *fp; char s[]="abcdefghijklmnopqrstuvwxyz";char c;if( (fp = fopen("file_data.txt","w+")) == NULL ){ printf("can not open the file\n");exit(0);}fprintf(fp,"%s",s);fseek(fp,5L,0);fscanf(fp,"%c",&c);printf("The first character is: %c\n",c);fclose(fp);}
ftell函数
【例13.12】求出文件中包含的字节数。
分析:
先将文件的位置指针移到文件末尾,再通过返回位置指针的位置来取得文件的字节数。
#include<stdio.h>#include<stdlib.h>void main(){ FILE *fp;long l;if( (fp = fopen("file_data.txt","r")) == NULL ){ printf("can not open the file\n");exit(0);}fseek(fp,0L,SEEK_END); //将文件的位置指针移到文件末尾l=ftell(fp); //返回位置指针的位置fclose(fp);printf("the length of file is %ld\n",l);}
feof函数
【例13.13】判断文件指针是否在文本文件file_data.txt的末尾,并给出相应提示。
编写程序如下:
#include<stdio.h>#include<stdlib.h>void main(){ FILE *fp;char ch;if( (fp = fopen("file_data.txt","r")) == NULL ){ printf("can not open the file\n");exit(0);}do{ ch=fgetc(fp);putchar(ch);}while (!feof(fp)); //判断是否到达文件尾if(feof(fp)) printf("\nWe have reached end-of-file\n");//判断是否到达文件尾fclose(fp);}
ferror函数
【例13.14】判断的文本文件file_data.txt是否有错误,并给出相应提示。
编写程序如下:
#include<stdio.h>#include<stdlib.h>void main(){ FILE *fp;if( (fp = fopen("file_data.txt","r")) == NULL ){ printf("can not open the file\n");exit(0);}if(ferror(fp))printf("Error reading from file_data.txt\n");elseprintf("There is no error\n");fclose(fp);}
相关文章:

C语言下的文件详解
主要内容 文件概述文件指针文件的打开与关闭文件的读写 文件 把输入和输出的数据以文件的形式保存在计算机的外存储器上,可以确保数据能随时使用,避免反复输入和读取数据 文件概述 文件是指一组相关数据的有序集合 文件是存储数据的基本单位&#…...
Oracle PL / SQL块结构
在PL / SQL中,最小的有意义的代码分组被称为块。 块代码为变量声明和异常处理提供执行和作用域边界。 PL / SQL允许您创建匿名块和命名块。 命名块可以是包,过程,函数,触发器或对象类型。 PL / SQL是SQL的过程语言扩展&#x…...

MySQL的安装和启动
安装 版本 1,社区版:免费,不提供任何技术支持 2,商业版:可以试用30天,官方提供技术支持下载 1,下载地址:https://dev.mysql.com/downloads/mysql/ 2,安装:傻…...

Prometheus概述
1.什么是prometheus Prometheus 是一个开源的服务监控系统和时序数据库,其提供了通用的数据模型和快捷数据采集、存储和查询接口。它的核心组件Prometheus server会定期从静态配置的监控目标或者基于服务发现自动配置的自标中进行拉取数据,当新拉取到的…...
【SQL】什么是最左前缀原则/最左匹配原则
最左前缀原则(或最左匹配原则)是关系型数据库在使用复合索引时遵循的一条重要规则。该原则指的是,当查询条件使用复合索引时,查询优化器会首先使用索引的最左边的列,依次向右匹配,直到不再满足查询条件为止…...
java项目配置logback日志
在resource目录下添加logback配置文件 <?xml version"1.0" encoding"UTF-8"?> <configuration scan"true" scanPeriod"60 seconds" debug"false"><property name"log_dir" value"/APL/log…...

Python入门 2024/7/6
目录 元组的定义和操作 字符串的定义和操作 字符串 字符串的替换 字符串的分割 字符串的规整操作(去除前后空格) 字符串的规整操作(去掉前后指定字符串) 操作 字符串的替换 字符串的分割 字符串的规整操作 统计字符串的…...

ChatGPT4深度解析:探索智能对话新境界
大模型chatgpt4分析功能初探 目录 1、探测目的 2、目标变量分析 3、特征缺失率处理 4、特征描述性分析 5、异常值分析 6、相关性分析 7、高阶特征挖掘 1、探测目的 1、分析chat4的数据分析能力,提高部门人效 2、给数据挖掘提供思路 3、原始数据…...

触底加载的两种思路(以vue3前端和nodejs后端为例)
一:首先,nodejs后端的代码都是一样的. 需要前端返回page参数,然后nodejs逻辑进行处理,截取页数和每页条数和总条数, 总条数用来作为判断是否有数据的条件,也可以不用,注意看下文 一:不用获取容器高度的. pinia中进行的axios请求处理 在vue文件中进行pinia中数据的导入,继续进…...

tobias实现支付宝支付
tobias是一个为支付宝支付SDK做的Flutter插件。 如何使用 你需要在pubspec.yaml中配置url_scheme。url_scheme是一个独特的字符串,用来重新启动你的app,但是请注意字符串“_”是不合法的。 在iOS端,你还需要配置并传入一个universal link。…...

【音视频 | RTSP】RTSP协议详解 及 抓包例子解析(详细而不赘述)
😁博客主页😁:🚀https://blog.csdn.net/wkd_007🚀 🤑博客内容🤑:🍭嵌入式开发、Linux、C语言、C、数据结构、音视频🍭 🤣本文内容🤣&a…...

SQL Server 2022 中的 Tempdb 性能改进非常显著
无论是在我的会话中还是在我写的博客中,Tempdb 始终是我的话题。然而,当谈到 SQL Server 2022 中引入的重大性能变化时,我从未如此兴奋过。他们解决了我们最大的性能瓶颈之一,即系统页面闩锁并发。 在 SQL Server 2019 中&#x…...
C++ Lambda表达式第二篇, Lambda表达式
C Lambda表达式 Lambda 捕获含有模板参数的Lambda表达式无模板参数的Lambda表达式 Lambda 捕获 captures是零个或多个捕获的逗号分隔列表,可以选择以capture-default开头。捕获列表定义可从 lambda 函数体内访问的外部变量。唯一的捕获默认值是 &,…...

Linux系统的介绍和常用命令
文章目录 介绍常用命令文件和目录操作文件内容操作系统管理命令网络命令 🎈个人主页:程序员 小侯 🎐CSDN新晋作者 🎉欢迎 👍点赞✍评论⭐收藏 ✨收录专栏:Liunx系统 ✨文章内容:Liunx系统介绍 &…...

IDEA安装IDE Eval Reset插件,30天自动续期,无限激活
第一步: 下载idea 注意:版本要是2021.2.2以下 第二步:快捷键CtrlAlts打开设置 第三步:打开下图中蓝色按钮 第四步:点击弹窗的 “” ,并输入 plugins.zhile.io 点击 “ok” 第五步:搜索IDE Ea…...

【C++】初步认识C++
1. 初识C1.1 C概念相关1.2 C发展史及其重要性1.2.1 发展史1.2.2 重要性 2. C关键字3. 命名空间4. 输入和输出 个人主页:C_GUIQU 归属专栏:【C学习】 1. 初识C 1.1 C概念相关 C语言是结构化和模块化的语言,适合处理较小规模的程序。 【来源】…...

【Python数据分析与可视化】:使用【Matplotlib】实现销售数据的全面分析 ——【Matplotlib】数模学习
目录 安装Matplotlib 1.打开PyCharm: 2.打开终端: 3.安装Matplotlib: 4.确认安装: 导入Matplotlib 创建简单的折线图 代码解析: 创建子图 代码解析: 创建柱状图 代码解析: 创建散点…...

Docker加速器配置指南:提升镜像下载速度的秘诀 加速安装Mysql Redis ES
在安装 Docker 镜像时,由于官方镜像下载速度较慢,我们可以使用阿里云的镜像加速器来提升下载速度。 使用阿里云镜像加速器 首先,找到并配置阿里云的镜像加速器。安装教程如下: 登录阿里云,进入容器镜像服务。直达链…...
32单片机,C语言与汇编联合编译的几种方式
适用编译器:Keil5 方式一: 单独创建一个.s汇编文件,在汇编文件内对函数进行EXPORT声明 r0寄存器是函数传入的第一个参数,r1寄存器是函数传入的第二个参数,以次类推。参数最多不确定是到r4为止,还是到r12…...

基于GWO-CNN-BiLSTM数据回归预测(多输入单输出)-灰狼优化算法优化CNN-BiLSTM
基于GWO-CNN-BiLSTM数据回归预测(多输入单输出)-灰狼优化算法优化CNN-BiLSTM 1.数据均为Excel数据,直接替换数据就可以运行程序。 2.所有程序都经过验证,保证程序可以运行。 3.具有良好的编程习惯,程序均包含简要注释。 获取方式 https:/…...

网络六边形受到攻击
大家读完觉得有帮助记得关注和点赞!!! 抽象 现代智能交通系统 (ITS) 的一个关键要求是能够以安全、可靠和匿名的方式从互联车辆和移动设备收集地理参考数据。Nexagon 协议建立在 IETF 定位器/ID 分离协议 (…...

【Python】 -- 趣味代码 - 小恐龙游戏
文章目录 文章目录 00 小恐龙游戏程序设计框架代码结构和功能游戏流程总结01 小恐龙游戏程序设计02 百度网盘地址00 小恐龙游戏程序设计框架 这段代码是一个基于 Pygame 的简易跑酷游戏的完整实现,玩家控制一个角色(龙)躲避障碍物(仙人掌和乌鸦)。以下是代码的详细介绍:…...
DockerHub与私有镜像仓库在容器化中的应用与管理
哈喽,大家好,我是左手python! Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库,用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...

ESP32读取DHT11温湿度数据
芯片:ESP32 环境:Arduino 一、安装DHT11传感器库 红框的库,别安装错了 二、代码 注意,DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...
【磁盘】每天掌握一个Linux命令 - iostat
目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat(I/O Statistics)是Linux系统下用于监视系统输入输出设备和CPU使…...
电脑插入多块移动硬盘后经常出现卡顿和蓝屏
当电脑在插入多块移动硬盘后频繁出现卡顿和蓝屏问题时,可能涉及硬件资源冲突、驱动兼容性、供电不足或系统设置等多方面原因。以下是逐步排查和解决方案: 1. 检查电源供电问题 问题原因:多块移动硬盘同时运行可能导致USB接口供电不足&#x…...
Java - Mysql数据类型对应
Mysql数据类型java数据类型备注整型INT/INTEGERint / java.lang.Integer–BIGINTlong/java.lang.Long–––浮点型FLOATfloat/java.lang.FloatDOUBLEdouble/java.lang.Double–DECIMAL/NUMERICjava.math.BigDecimal字符串型CHARjava.lang.String固定长度字符串VARCHARjava.lang…...
Nginx server_name 配置说明
Nginx 是一个高性能的反向代理和负载均衡服务器,其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机(Virtual Host)。 1. 简介 Nginx 使用 server_name 指令来确定…...
WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)
一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解,适合用作学习或写简历项目背景说明。 🧠 一、概念简介:Solidity 合约开发 Solidity 是一种专门为 以太坊(Ethereum)平台编写智能合约的高级编…...

《基于Apache Flink的流处理》笔记
思维导图 1-3 章 4-7章 8-11 章 参考资料 源码: https://github.com/streaming-with-flink 博客 https://flink.apache.org/bloghttps://www.ververica.com/blog 聚会及会议 https://flink-forward.orghttps://www.meetup.com/topics/apache-flink https://n…...