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:/…...

自动控制:反馈控制
自动控制:反馈控制 反馈控制(Feedback Control)是一种在控制系统中通过测量输出信号,并将其与期望信号进行比较,产生误差信号,再根据误差信号调整输入来达到控制目标的方法。反馈控制是自动控制系统中最常…...

sqlite 数据库 介绍
文章目录 前言一、什么是 SQLite ?二、语法三、SQLite 场景四、磁盘文件 前言 下载 目前已经出到了, Version 3.46.0 SQLite,是一款轻型的数据库,是遵守ACID的关系型数据库管理系统,它包含在一个相对小的C库中。它是…...

【机器学习】机器学习重塑广告营销:精准触达,高效转化的未来之路
📝个人主页🌹:Eternity._ 🌹🌹期待您的关注 🌹🌹 ❀目录 📒1. 引言📙2. 机器学习基础与广告营销的结合🧩机器学习在广告营销中的核心应用领域🌹用…...

常见的Java运行时异常
常见的Java运行时异常 1、ArithmeticException(算术异常)2、ClassCastException (类转换异常)3、IllegalArgumentException (非法参数异常)4、IndexOutOfBoundsException (下标越界异常…...

CANoe的capl调用Qt制作的dll
闲谈 因为Qt封装了很多个人感觉很好用的库,所以一直想通过CAPL去调用Qt实现一些功能,但是一直没机会(网络上也没看到这方面的教程),这次自己用了两天,踩了很多坑,终于是做成了一个初步的调用方…...

论如何搭建属于自己的服务器?
在现如今的数字化时代中,为了能够搭建网站和运行应用程序,很多人选择搭建属于自己的服务器,下面我们就来了解一下如何搭建服务器吧! 搭建服务器我们首先需要选择适合自身需求的硬件设备,其中包含内存、CPU和存储等配置…...

【C++ OpenCV】机器视觉-二值图像和灰度图像的膨胀、腐蚀、开运算、闭运算
原图 结果图 //包含头文件 #include <opencv2/opencv.hpp>//命名空间 using namespace cv; using namespace std;//全局函数声明部分//我的腐蚀运算 Mat Erode(Mat src, Mat Mask, uint32_t x0, uint32_t y0) {uint32_t x 0, y 0;Mat dst(src.rows, src.cols, CV_8U…...

STMF4学习笔记RTC(天空星)
前言:本篇笔记参考嘉立创文档,连接放在最后 #RTC相关概念定义 Real-Time Clock 缩写 RTC 翻译 实时时钟,是单片机片内外设的一种,作用于提供准确的时间还有日期,这个外设有独立的电源,当单片机停止供电…...

vue数组变化的侦测***
数组变化的侦测 变更方法 vue能够侦听响应式数组的变更方法,并在他们被调用时触发相关更新。这些变更方法包括: push()pop()shift()unshift()splice()sort()reverse() 替换一个数组 变更方法,顾名思义,就是会对调用他们的原数组进…...

k8s-第十节-Ingress
Ingress 介绍 Ingress 为外部访问集群提供了一个 统一 入口,避免了对外暴露集群端口;功能类似 Nginx,可以根据域名、路径把请求转发到不同的 Service。可以配置 https 跟 LoadBalancer 有什么区别? LoadBalancer 需要对外暴露…...