C语言文件操作

本文重点:

什么是文件

文件名

文件类型

文件缓冲区

文件指针

文件的打开和关闭

文件的顺序读写

文件的随机读写

文件结束的判定

什么是文件

磁盘上的文件是文件。

但是在程序设计中,我们一般谈的文件有两种:程序文件、数据文件

程序文件

包括源程序文件(后缀为.c),目标文件(windows环境后缀为.obj),可执行程序(windows环境后缀 为.exe)。

数据文件

文件的内容不一定是程序,而是程序运行时读写的数据,比如程序运行需要从中读取数据的文件,或者输出内 容的文件。

本章讨论的是数据文件。

在以前各章所处理数据的输入输出都是以终端为对象的,即从终端的键盘输入数据,运行结果显示到显示器上。 其实有时候我们会把信息输出到磁盘上,当需要的时候再从磁盘上把数据读取到内存中使用,这里处理的就是磁盘上 文件。

文件名

一个文件要有一个唯一的文件标识,以便用户识别和引用。 文件名包含3部分:文件路径+文件名主干+文件后缀 例如: c:\code\test.txt 为了方便起见,文件标识常被称为文件名。

文件类型

根据数据的组织形式,数据文件被称为文本文件或者二进制文件。 

数据在内存中以二进制的形式存储,如果不加转换的输出到外存,就是二进制文件。

如果要求在外存上以ASCII码的形式存储,则需要在存储前转换。

以ASCII字符的形式存储的文件就是文本文件。 一个数据在内存中是怎么存储的呢?

字符一律以ASCII形式存储,数值型数据既可以用ASCII形式存储,也可以使用二进制形式存储。 如有整数10000,如果以ASCII码的形式输出到磁盘,则磁盘中占用5个字节(每个字符一个字节),而二进制形式输 出,则在磁盘上只占4个字节(VS2013测试)。

 db319423baff45379d33cdb9781b0434.png

dbb16e1afeac4a2e98f9c6c4fe1c9946.png

e935dc4ee8064a188b3966c494b53b7d.png

f5d52156bc7541e892cb5347103051e8.png

不同的C编译器的FILE类型包含的内容不完全相同,但是大同小异。 每当打开一个文件的时候,系统会根据文件的情况自动创建一个FILE结构的变量,并填充其中的信息,使用者不必关 心细节。 一般都是通过一个FILE 的指针来维护这个 FILE 结构的变量,这样使用起来更加方便。 下面我们可以创建一个FILE*的指针变量:

 FILE* pf;//文件指针变量

定义pf是一个指向FILE类型数据的指针变量。可以使pf指向某个文件的文件信息区(是一个结构体变量)。通过该文 件信息区中的信息就能够访问该文件。也就是说,通过文件指针变量能够找到与它关联的文件。 比如:

fad77cb08416436cb2d46eb4590a60f7.png文件的打开和关闭

文件在读写之前应该先打开文件,在使用结束之后应该关闭文件。

在编写程序的时候,在打开文件的同时,都会返回一个FILE*的指针变量指向该文件,也相当于建立了指针和文件的 关系。

ANSIC 规定使用fopen函数来打开文件,fclose来关闭文件

FILE * fopen ( const char * filename, const char * mode );int fclose ( FILE * stream );

5a5ba87675bf4535a886a5dbe21042b1.png

int main()
{   FILE* pf;pf = fopen("test.txt", "r");if (NULL == pf){perror("fopen");return 1;}fclose(pf);pf = NULL;return 0;
}

注:使用w时会将原来文件的内容清空,相当于重新创造一个文件。

int main()
{   FILE* pf;pf = fopen("test.txt", "r");//可以在test前面加../意为访问上一级根目录文件if (NULL == pf){perror("fopen");return 1;}fclose(pf);pf = NULL;return 0;
}

文件的顺序读写

9ce25770f08947b0b61346746e68d265.png

int main()
{   FILE* pf;pf = fopen("test.txt", "w");if (NULL == pf){perror("fopen");return 1;}//写文件fputc('a', pf);fputc('b', pf);fputc('c', pf);fputc('d', pf);//关闭文件fclose(pf);return 0;
}

56cb00947e7c4cf09baec21adbdd63c8.png

7c88c008550e4c358aba9ffa28e84ec2.png

int main()
{   FILE* pf;pf = fopen("test.txt", "r");if (NULL == pf){perror("fopen");return 1;}int ch = fgetc(pf);printf("%c", ch);ch = fgetc(pf);printf("%c", ch);ch = fgetc(pf);printf("%c", ch);fclose(pf);pf = NULL;return 0;
}

 f80fdc115e2041e294353ce019de6ec6.png

可以看到fgetc读字符时是一个一个读的。同样fputs写入时也是一个一个写入的。

int main()
{   FILE* pf;pf = fopen("test.txt", "w");if (NULL == fopen){perror("fopen");return 1;}//写文件fputs("hello world\n", pf);fputs("hi\n", pf);return 0;
}

96614f003208455e90bf23a78ee065b0.png

int main()
{   FILE* pf= fopen("test.txt", "r");if (NULL == pf){perror("fopen");return 1;}char ch[20] = {0};fgets(ch,20,pf);printf("%s",ch);fgets(ch, 20, pf);printf("%s", ch);fclose(pf);pf = NULL;return 0;
}

a026c2651b7d46718173f61f9e1a34de.png

struct S
{char name[20];int age;float score;
};
int main()
{   struct S s = { "zhangsan",20,95.5 };FILE* pf = fopen("test.txt", "w");if (NULL == pf){perror("fopen");return 1;}fprintf(pf,"%s %d %f",s.name,s.age,s.score);fclose(pf);pf = NULL;return 0;
}

 a4ab3dcb2ec04fe08b9aa834a0026abf.png

int main()
{struct S s = { 0 };FILE* pf = fopen("test.txt", "r");if (NULL == pf){perror("fopen");return 1;}fscanf(pf, "%s %d %f", s.name, &(s.age), &(s.score));printf("%s %d %f", s.name, s.age, s.score);fclose(pf);pf = NULL;return 0;
}

 f6342924291341fd8a8960a5093c8c82.png

int main()
{   struct S s = { 0 };FILE* pf = fopen("test.txt", "rb");if (NULL == pf){perror("fopen");return 1;}fread(&s,sizeof(struct S),1,pf);printf("%s %d %f\n", s.name, s.age, s.score);fclose(pf);pf = NULL;return 0;
}

 8fc69ef5073540fcb8a901fbabeea564.png

int main()
{struct S s = { "张三", 20, 98.5};FILE* pf = fopen("test.txt", "wb");if (NULL == pf){perror("fopen");return 1;}//写文件fwrite(&s, sizeof(struct S), 1, pf);//关闭文件fclose(pf);pf = NULL;return 0;
}

96752bba5cb14693b6c803cdae033453.png

int main()
{struct S s = {"zhangsan", 20, 98.5};char buf[100] = { 0 };sprintf(buf, "%s %d %f", s.name, s.age, s.score);printf("%s\n", buf);//按照字符串打印的struct S tmp = { 0 };sscanf(buf, "%s %d %f", tmp.name, &(tmp.age), &(tmp.score));printf("%s %d %f\n", tmp.name, tmp.age, tmp.score);//打印结构体数据return 0;
}

a27b872978ed4cbaacbe7d87be9cefe7.png

7c1d90a8770b4578b61e49316207eb98.png

67482146a2604beba0efd1ab9494bd79.png

7fec0067306047168f4e6d04444c88f8.png

5d868806e4264071b59a7f92890d4080.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/6518.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Ubuntu24.04初始化MySQL报错 error while loading shared libraries libaio.so.1

Ubuntu24.04初始化MySQL报错 error while loading shared libraries: libaio.so.1 问题一:libaio1不存在 # 提示libaio1不存在 [rootzabbix-mysql-master.example.com x86_64-linux-gnu]#apt install numactl libaio1 Reading package lists... Done Building depe…

『 实战项目 』Cloud Backup System - 云备份

文章目录 云备份项目服务端功能服务端功能模块划分客户端功能客户端模块划分 项目条件Jsoncpp第三方库Bundle第三方库httplib第三方库Request类Response类Server类Client类搭建简单服务器搭建简单客户端 服务端工具类实现 - 文件实用工具类服务器配置信息模块实现- 系统配置信息…

No.36 学习 | Python 函数:从基础到实战

最近我在学 Python 编程,今天可算是狠狠钻研了一把 Python 里的函数,感觉脑袋里的知识又充实了不少,赶紧来记一记。 一、Python函数基础概念 (一)pass语句:代码块的“占位符” 在编写代码时,有…

easyexcel读取写入excel easyexceldemo

1.新建springboot项目 2.添加pom依赖 <name>excel</name> <description>excelspringboot例子</description><parent> <groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId&…

Qt 5.14.2 学习记录 —— 십유 布局管理器

文章目录 1、QVBoxLayout2、QHBoxLayout3、QGridLayout4、QFormLayout5、QSpacerItem 布局管理器是为了让程序员不需要自己决定控件的绝对位置&#xff0c;而是通过布局管理器方便地放置 1、QVBoxLayout 垂直布局管理器 #include <QPushButton> #include <QVBoxLayo…

Markdown Viewer 浏览器, vscode

使用VS Code插件打造完美的MarkDown编辑器&#xff08;插件安装、插件配置、markdown语法&#xff09;_vscode markdown-CSDN博客 右键 .md 文件&#xff0c;选择打开 方式 &#xff08;安装一些markdown的插件) vscode如何预览markdown文件 | Fromidea GitCode - 全球开发者…

每日十题八股-2025年1月23日

1.快排为什么时间复杂度最差是O&#xff08;n^2&#xff09; 2.快排这么强&#xff0c;那冒泡排序还有必要吗&#xff1f; 3.如果要对一个很大的数据集&#xff0c;进行排序&#xff0c;而没办法一次性在内存排序&#xff0c;这时候怎么办&#xff1f; 4.面试官&#xff1a;你的…

H3C-无线WLAN配置案例(二层隧道转发)

目录 1.无线wlan产生背景:2.网络拓扑:3.网络简述:4.网络配置:4.1 网络基础配置4.2 无线wlan二层隧道转发配置4.3 无线wlan验证: 1.无线wlan产生背景: 无线WLAN&#xff08;无线局域网&#xff09;的产生背景主要源于以下几个方面的需求和技术发展&#xff1a;移动性和便捷性需…

HarmonyOS Next构建工具 lycium 原理介绍

HarmonyOS Next构建工具 lycium 原理介绍 背景介绍 HarmonyOS Next中很多系统API是以C接口提供&#xff0c;如果要使用C接口&#xff0c;必须要使用NAPI在ArkTS与C间交互&#xff0c;这种场景在使用DevEco-Studio中集成的交叉编译工具&#xff0c;以及cmake构建工具就完全够用…

设计模式的艺术-职责链模式

行为型模式的名称、定义、学习难度和使用频率如下表所示&#xff1a; 1.如何理解职责链模式 最常见的职责链是直线型&#xff0c;即沿着一条单向的链来传递请求。链上的每一个对象都是请求处理者&#xff0c;职责链模式可以将请求的处理者组织成一条链&#xff0c;并让请求沿着…

js学习笔记(2)

一、函数 1.JavaScript 函数语法 函数就是包裹在花括号中的代码块&#xff0c;前面使用了关键词 function&#xff1a; function functionname() {// 执行代码 } 当调用该函数时&#xff0c;会执行函数内的代码。 可以在某事件发生时直接调用函数&#xff08;比如当用户点…

洛谷刷题1-3

比较巧妙&#xff0c;求最小公倍数&#xff0c;看多少个数一次循环&#xff0c;直接求解就好了&#xff0c;N的数量级比较大&#xff0c;一层循环也会超时&#xff0c;也用了点双指针的想法&#xff08;归并排序&#xff09; 这里很大的问题&#xff0c;主要是cin输入的时候遇到…

2025年数学建模美赛:A题分析(1)Testing Time: The Constant Wear On Stairs

2025年数学建模美赛 A题分析&#xff08;1&#xff09;Testing Time: The Constant Wear On Stairs 2025年数学建模美赛 A题分析&#xff08;2&#xff09;楼梯磨损分析模型 2025年数学建模美赛 A题分析&#xff08;3&#xff09;楼梯使用方向偏好模型 2025年数学建模美赛 A题分…

云原生时代,如何构建高效分布式监控系统

文章目录 一.监控现状二.Thanos原理分析SidecarQuerierStoreCompactor 三.Sidecar or ReceiverThanos Receiver工作原理 四.分布式运维架构 一.监控现状 Prometheus是CNCF基金会管理的一个开源监控项目&#xff0c;由于其良好的架构设计和完善的生态&#xff0c;迅速成为了监控…

每天五分钟深度学习pytorch:基于VGG神经网络完成CAFIR10的识别

本文重点 前面的所有模型我们都是使用VGG跑了mnist数据集,本次我们换一个数据集,我们使用CAFIR数据集,这个数据集我们前面介绍过,它和mnist不一样了,mnist是灰度图,这个是彩色图,所以它的通道数是3,这样我们再构建卷积神经网路的时候,第一个卷积层的输入通道数就应该…

力扣707题(2)——设计链表

#题目 #3,5和6的代码 今天看剩下几个题的代码&#xff0c;1,2,4的代码已经在上篇博客写过了想看的小伙伴移步到&#xff1a; 力扣707题——设计链表-CSDN博客 //第3题头插法 void addAtHead(int val){ //记录头结点ListNode nhead; //新节点的创建,并让它指向原本头结点的后…

STM32_SD卡的SDIO通信_基础读写

本篇将使用CubeMXKeil, 创建一个SD卡读写的工程。 目录 一、SD卡要点速读 二、SDIO要点速读 三、SD卡座接线原理图 四、CubeMX新建工程 五、CubeMX 生成 SD卡的SDIO通信部分 六、Keil 编辑工程代码 七、实验效果 实现效果&#xff0c;如下图&#xff1a; 一、SD卡 速读…

CPU 缓存基础知识

并发编程首先需要简单了解下现代CPU相关知识。通过一些简单的图&#xff0c;简单的代码&#xff0c;来认识CPU以及一些常见的问题。 目录 CPU存储与缓存的引入常见的三级缓存结构缓存一致性协议MESI协议缓存行 cache line 通过代码实例认识缓存行的重要性 CPU指令的乱序执行通过…

【博客之星】年度总结:在云影与墨香中探寻成长的足迹

&#x1f407;明明跟你说过&#xff1a;个人主页 &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 目录 一、年度回顾 1、创作历程 2、个人成长 3、个人生活与博客事业 二、技术总结 1、赛道选择 2、技术工具 3、实战项目 三、前景与展望 1、云原生未来…

2024 自主创业事业小结和2025展望

一 2024创业事业小结&#xff1a; 1.1 2024 自主创业项目小结&#xff1a; 2024年我们小团队主要做了两大类的项目&#xff1a; 1&#xff0c;工业类 在工业领域的项目&#xff0c;我们做了3个落地的视觉集成项目。 1.1 旋转角度的测量&#xff1a; 由于是外包项目&#…