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:/…...
KubeSphere 容器平台高可用:环境搭建与可视化操作指南
Linux_k8s篇 欢迎来到Linux的世界,看笔记好好学多敲多打,每个人都是大神! 题目:KubeSphere 容器平台高可用:环境搭建与可视化操作指南 版本号: 1.0,0 作者: 老王要学习 日期: 2025.06.05 适用环境: Ubuntu22 文档说…...

Docker 离线安装指南
参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性,不同版本的Docker对内核版本有不同要求。例如,Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本,Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...
设计模式和设计原则回顾
设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...

【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器
一.自适应梯度算法Adagrad概述 Adagrad(Adaptive Gradient Algorithm)是一种自适应学习率的优化算法,由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率,适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...
React Native 开发环境搭建(全平台详解)
React Native 开发环境搭建(全平台详解) 在开始使用 React Native 开发移动应用之前,正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南,涵盖 macOS 和 Windows 平台的配置步骤,如何在 Android 和 iOS…...

中南大学无人机智能体的全面评估!BEDI:用于评估无人机上具身智能体的综合性基准测试
作者:Mingning Guo, Mengwei Wu, Jiarun He, Shaoxian Li, Haifeng Li, Chao Tao单位:中南大学地球科学与信息物理学院论文标题:BEDI: A Comprehensive Benchmark for Evaluating Embodied Agents on UAVs论文链接:https://arxiv.…...

iPhone密码忘记了办?iPhoneUnlocker,iPhone解锁工具Aiseesoft iPhone Unlocker 高级注册版分享
平时用 iPhone 的时候,难免会碰到解锁的麻烦事。比如密码忘了、人脸识别 / 指纹识别突然不灵,或者买了二手 iPhone 却被原来的 iCloud 账号锁住,这时候就需要靠谱的解锁工具来帮忙了。Aiseesoft iPhone Unlocker 就是专门解决这些问题的软件&…...

el-switch文字内置
el-switch文字内置 效果 vue <div style"color:#ffffff;font-size:14px;float:left;margin-bottom:5px;margin-right:5px;">自动加载</div> <el-switch v-model"value" active-color"#3E99FB" inactive-color"#DCDFE6"…...

高等数学(下)题型笔记(八)空间解析几何与向量代数
目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...

保姆级教程:在无网络无显卡的Windows电脑的vscode本地部署deepseek
文章目录 1 前言2 部署流程2.1 准备工作2.2 Ollama2.2.1 使用有网络的电脑下载Ollama2.2.2 安装Ollama(有网络的电脑)2.2.3 安装Ollama(无网络的电脑)2.2.4 安装验证2.2.5 修改大模型安装位置2.2.6 下载Deepseek模型 2.3 将deepse…...