C语言文件操作(详细)

⽬录
一. 为什么使⽤⽂件?
二. 什么是⽂件?
三. ⼆进制⽂件和⽂本⽂件?
四. ⽂件的打开和关闭
五. ⽂件的顺序读写
六. ⽂件的随机读写
七. ⽂件读取结束的判定
八. ⽂件缓冲区

一. 为什么使⽤⽂件?

如果没有⽂件,我们写的程序的数据是存储在电脑的内存中,如果程序退出,内存回收,数据就丢失了,等再次运⾏程序,是看不到上次程序的数据的,如果要将数据进⾏持久化的保存,我们可以使用文件。

二. 什么是⽂件? 

磁盘(硬盘)上的⽂件是⽂件。 但是在程序设计中,我们⼀般谈的⽂件有两种:程序⽂件、数据⽂件(从⽂件功能的⻆度来分类的)。

三. ⼆进制⽂件和⽂本⽂件? 

1.根据数据的组织形式,数据⽂件被称为⽂本⽂件或者⼆进制⽂件。数据在内存中以⼆进制的形式存储,如果不加转换的输出到外存的⽂件中,就是⼆进制⽂件。如果要求在外存上以ASCII码的形式存储,则需要在存储前转换。以ASCII字符的形式存储的⽂件就是⽂本⽂件。

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

 

四. ⽂件的打开和关闭 

说到文件的打开和关闭,就要说到流和标准流,其实打开文件就是打开流。 

1.流:
我们程序的数据需要输出到各种外部设备,也需要从外部设备获取数据,不同的外部设备的输⼊输出操作各不相同,为了便程序员对各种设备进⾏⽅便的操作,我们抽象出了流的概念,我们可以把流 想象成流淌着字符的河。C程序针对⽂件、画⾯、键盘等的数据输⼊输出操作都是通过流操作的⼀般情况下,我们要想向流⾥写数据,或者从流中读取数据,都是要打开流,然后操作

 2.标准流:那为什么我们从键盘输⼊数据,向屏幕上输出数据,并没有打开流呢?那是因为C语⾔程序在启动的时候,默认打开了3个流。第一个stdin - 标准输⼊流,在⼤多数的环境中从键盘输⼊,scanf函数就是从标准输⼊流中读取数据。第二个:stdout - 标准输出流,⼤多数的环境中输出⾄显⽰器界⾯,printf函数就是将信息输出到标准输出 流中。第三个:stderr - 标准错误流,⼤多数环境中输出到显⽰器界⾯;stdin、stdout、stderr 三个流的类型是: FILE* ,通常称为件指针。 C语⾔中,就是通过 FILE* 的⽂件指针来维护流的各种操作的

3。文件指针:想要打开文件,就要对文件指针操作。每个被使的⽂件都在内存中开辟了⼀个相应的⽂件信息区,来存放⽂件的相关信息(如⽂件的名 字,件状态及⽂件当前的位置等)。这些信息是保存在⼀个结构体变量中的。该结构体类型是由系 统声明的,取名 FILE.(不同的C编译器的FILE类型包含的内容不完全相同,但是⼤同⼩异)如图可以这样理解(这里的pf1和pf2都是文件指针)

 

3.⽂件在读写之前应该先打开⽂件,在使⽤结束之后应该关闭⽂件 下面给出文件打开和关闭的代码:

//打开⽂件
FILE * fopen ( const char * filename, const char * mode );
//关闭⽂件
int fclose ( FILE * stream );
#include <stdio.h>
int main ()
{FILE * pFile;//打开⽂件pFile = fopen ("myfile.txt","w");//⽂件操作if (pFile!=NULL){fputs ("fopen example",pFile);//关闭⽂件fclose (pFile);}return 0;
}

五. ⽂件的顺序读写

1.部分顺序读写函数:

fgetc

字符输⼊函数 所有输⼊流

fputc

字符输出函数 所有输出流

fgets

⽂本⾏输⼊函数 所有输⼊流

fputs

⽂本⾏输出函数 所有输出流

fscanf

格式化输⼊函数

所有输⼊流

fprintf

格式化输出函数 所有输出流

fread

⼆进制输⼊ ⽂件

fwrite

⼆进制输出 ⽂件

这里简单介绍一两个,其他可以在https://cplusplus.com/ 查相关C语言函数也可以在这里查

 

#include <stdio.h>int main ()
{FILE * pFile;char c;pFile = fopen ("alphabet.txt","w");if (pFile!=NULL) {for (c = 'A' ; c <= 'Z' ; c++)fputc ( c , pFile );fclose (pFile);}return 0;

六. ⽂件的随机读写 

1.fseek,函数根据⽂件指针的位置和偏移量来定位⽂件指针 下面来呈现一下

 

下面是对这函数的分析: 

  

2.ftell函数返回⽂件指针相对于起始位置的偏移量(这样也可以计算字符的个数) 

 

 

#include <stdio.h>
int main ()
{FILE * pFile;long size;pFile = fopen ("myfile.txt","rb");if (pFile==NULL) perror ("Error opening file");else{fseek (pFile, 0, SEEK_END); // non-portablesize=ftell (pFile);fclose (pFile);printf ("Size of myfile.txt: %ld bytes.\n",size);}return 0;
}

七. ⽂件读取结束的判定

1.在⽂件读取过程中,不能feof函数的返回值直接来判断⽂件的是否结束 ,文件结束有两种情况,一种是可能遇到文件末尾(用feof),另外是可能读取时发生错误(用ferror)这两个函数是通过流的标记值做出判断的)下面给个代码

int main()
{FILE* pf = fopen("data.txt", "r");if (pf == NULL){perror("fopen:data.txt");return 1;}int ch = 0;while ((ch = fgetc(pf)) != EOF){printf("%c", ch);}//判断什么原因导致读取错误if (feof(pf)){printf("遇到文件末尾读取正常");}else if (ferror(pf)){perror("fgetc");}return 0;
}

ferror和feof函数具体如下:

下面给出具体注意重点 :

 

八. ⽂件缓冲区(略)

ANSIC 标准采“缓冲⽂件系统” 处理的数据件的,所谓缓冲⽂件系统是指系统⾃动地在内存中为 程序中每⼀个正在使⽤的⽂件开辟⼀块“⽂件缓冲区”。从内存向磁盘输出数据会先送到内存中的缓 冲区,装满缓冲区后才⼀起送到磁盘上。如果从磁盘向计算机读⼊数据,则从磁盘⽂件中读取数据输 ⼊到内存缓冲区(充满缓冲区),然后再从缓冲区逐个地将数据送到程序数据区(程序变量等).缓冲区的⼤⼩根据C编译系统决定的。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

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

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

相关文章

kubernetes-k9s一个基于Linux 终端的集群管理工具

效果预览 下载 github 版本 此文档使用的版本是 v0.32.4&#xff0c;下载地址&#xff1a; https://github.com/derailed/k9s/releases/download/v0.32.4/k9s_linux_amd64.rpm 安装 rpm -ivh k9s_linux_amd64.rpm使用 启动 终端直接执行命令 k9s k9s基本操作 1 选择目…

“选项按钮”的妙用

背景&#xff1a;是否厌倦了下拉菜单&#xff1f;现在可以使用更好玩的选项按钮了。 操作&#xff1a;点击“开发工具”&#xff0c;插入“选项按钮”的窗体控件。 插入一个选项按钮以后&#xff0c;右键“设置控件格式”&#xff0c;设定单元格链接&#xff0c;比如说本次设定…

数学分析复习:振荡型级数的收敛判别

文章目录 振荡型级数的收敛判别 本篇文章适合个人复习翻阅&#xff0c;不建议新手入门使用 振荡型级数的收敛判别 直观上&#xff0c;振荡型级数说的是级数各项有正有负&#xff0c;求和的时候可以相互抵消&#xff0c;故可能收敛 命题&#xff1a;Abel求和公式 设复数列 { …

C++经典面试题目(六)

1、C中的循环结构有哪些&#xff1f;请举例说明它们的用法。 C 中的循环结构包括 for 循环、while 循环和 do-while 循环。 for 循环用于按指定的次数重复执行代码块。while 循环用于在条件为真时重复执行代码块。do-while 循环与 while 循环类似&#xff0c;但它先执行一次代…

vue3从精通到入门3:patch函数源码实现方式

Vue3中的patch函数是Vue渲染系统的核心部分&#xff0c;它负责比较新旧虚拟DOM&#xff08;VNode&#xff09;节点&#xff0c;并根据比较结果更新实际的DOM: 先了解下patch函数源码&#xff0c;再进行对其中的解析&#xff1a; function patch( n1: VNode | null, // 旧虚…

车载以太网AVB交换机 TSN交换机 时间敏感网络 6端口 百兆 SW100TSN

SW100 TSN时间敏感网络AVB交换机 为6端口百兆车载以太网交换机&#xff0c;其中包含5通道100BASE-T1泰科MATEnet接口和1个通道100/1000BASE-T标准以太网(RJ45接口)&#xff0c;可以实现纳米级时间同步&#xff0c;车载以太网多通道交换&#xff0c;Bypass数据采集和监控等功能&…

代码格式上对齐的方法

昨天看到课程老师在sourceinsight中的操作&#xff0c;他不到两秒就把每行缩进字符数不同的代码行给统一对齐了。 我觉得这个很有用&#xff0c;虽然只是一个操作问题&#xff0c;而非技术问题。后来查了网络&#xff0c;记录一下这个方法。 比如有下面每行缩进不一样的代码&…

亲身体验!人工智能对话无障碍 —— BRClient 使用指南

01 概述 BRClient 这个名字来源于“Bedrock Client”的简称&#xff0c;寓意是为用户提供一个坚实的基础。BRClient 作为一个开源的桌面应用&#xff0c;为用户提供了友好的图形界面&#xff0c;让每个人都能够轻松访问和使用 Claude 3 的强大功能。用户可以自定义 Claude 3 的…

Vue.js 模板语法

Vue.js 使用了基于 HTML 的模板语法&#xff0c;允许开发者声明式地将 DOM 绑定至底层 Vue 实例的数据。 Vue.js 的核心是一个允许你采用简洁的模板语法来声明式的将数据渲染进 DOM 的系统。 结合响应系统&#xff0c;在应用状态改变时&#xff0c; Vue 能够智能地计算出重新…

Web APIs知识点讲解(阶段三)

DOM- 节点操作 一.节点操作 1.DOM节点 目标&#xff1a;能说出DOM节点的类型 DOM节点 DOM树里每一个内容都称之为节点 节点类型 元素节点 所有的标签 比如 body、 div html 是根节点 属性节点 所有的属性 比如 href 文本节点 所有的文本 document树&#xff1a; 总结&…

docker - 删除TAG为<none>的镜像

1.查看所有标记为 none 的镜像 docker images -f "danglingtrue"2. 获取镜像id docker images -f "danglingtrue" -q3、移除所有标记为 none 的镜像 docker rmi $(docker images -f "danglingtrue" -q)无法解决&#xff1a; 直接使用 docke…

Wireshark 抓包

启动时选择一个有信号的网卡双击打开&#xff0c;或者在 捕获选择里打开选择网卡。 然后输出下面的规则就可以抓到报文了。 最上面的三条是建立连接时的三次握手&#xff0c; 下面是发送数据hello 对应两条数据 最下面的4条是断时的4次挥手

Si24R2F+2.4GHz ISM 频段低功耗无线集成嵌入式发射基带无线

Si24R2F在原有Si24R2F的基础上&#xff1a;优化了射频性能、增加NTC测温、增加自动唤醒间隔、优化了蓝牙性能。在固定资产管理、冷链物流和牛羊畜牧业标签市场更具竞争力。 在原有SI24R2E做白卡/校徽的群体&#xff0c;在新的卡片机应用&#xff0c;更加推荐用SI24R2F&#xff…

[串联] MySQL 存储原理 B+树

InnoDB 是一种兼顾高可靠性和高性能的通用存储引擎&#xff0c;在 MySQL 5.5 之后&#xff0c;InnoDB 是默认的 MySQL 存储引擎。 InnoDB 对每张表在磁盘中的存储以 xxx.ibd 后缀结尾&#xff0c;innoDB 引擎的每张表都会对应这样一个表空间文件&#xff0c;用来存储该表的表结…

AXI-Stream——草稿版

参考自哔站&#xff1a;FPGA IP之AXI4-Lite AXI4-Stream_哔哩哔哩_bilibili 信号 传输层级从小到大 包(----------transfer--transfer--------)------delay--------包(----------transfer--transfer--------) TKEEP和TSTRB共同决定了是哪种数据流

Cocos游戏开发中的动态切割图片

点击上方亿元程序员+关注和★星标 引言 Cocos游戏开发中的动态切割图片 近日,由于笔者发现了另外一个非常有趣的画线切割小游戏,沉迷于夺回秋雅无法自拔,导致断更了一周多。(尊嘟假嘟) 言归正传,游戏体验过之后,非常感兴趣这个游戏中的切割效果是如何实现的呢? 今天…

Bean对象拷贝工具封装

在平时后端开发的过程中&#xff0c;经常要把对象封装成DTO,VO对象&#xff0c;来与前端进行交互 下面就是自己封装的对象拷贝工具&#xff1a; public class BeanCopyUtils {private BeanCopyUtils() {}public static <V> V copyBean(Object source,Class<V> cl…

【剑指offer】顺时针打印矩阵

题目链接 acwing leetcode 题目描述 输入一个矩阵&#xff0c;按照从外向里以顺时针的顺序依次打印出每一个数字。 数据范围矩阵中元素数量 [0,400]。 输入&#xff1a; [ [1, 2, 3, 4], [5, 6, 7, 8], [9,10,11,12] ] 输出&#xff1a;[1,2,3,4,8,12,11,10,9,5,6,7] 解题 …

C语言动态分配数组

指针方式 可以使用指针&#xff0c;并在需要时通过malloc函数动态分配内存。下面是一个示例&#xff1a; #include <stdio.h> #include <stdlib.h>// 定义包含动态数组的结构体 struct DynamicArray {int size;int *array; };// 初始化结构体及动态数组 void ini…

【AutoML】一个用于图像、文本、时间序列和表格数据的AutoML

一个用于图像、文本、时间序列和表格数据的AutoML AutoGluon介绍安装AutoGluon快速上手 参考资料 AutoGluon自动化机器学习任务&#xff0c;使您能够在应用程序中轻松实现强大的预测性能。只需几行代码就可以训练和部署有关图像&#xff0c;文本&#xff0c;时间序列和表格数据…