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;比如说本次设定…

车载以太网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 的…

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

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

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游戏开发中的动态切割图片 近日,由于笔者发现了另外一个非常有趣的画线切割小游戏,沉迷于夺回秋雅无法自拔,导致断更了一周多。(尊嘟假嘟) 言归正传,游戏体验过之后,非常感兴趣这个游戏中的切割效果是如何实现的呢? 今天…

【剑指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] 解题 …

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

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

记录在项目中引用本地的npm包

1、先把需要的包下载下来&#xff0c;以Photo Sphere Viewer 为引用的npm包、项目以shpereRepo为例子 git clone https://github.com/mistic100/Photo-Sphere-Viewer2、拉下代码后修改之后执行 ./build.sh build.sh #!/usr/bin/env bashyarn run build targetDir"../sh…

mysql安装及操作

一、Mysql 1.1 MySQL数据库介绍 1.1.1 什么是数据库DB&#xff1f; DB的全称是database&#xff0c;即数据库的意思。数据库实际上就是一个文件集合&#xff0c;是一个存储数据的仓库&#xff0c;数据库是按照特定的格式把数据存储起来&#xff0c;用户可以对存储的数据进行…

【pytest、playwright】allure报告生成视频和图片

目录 1、修改插件pytest_playwright 2、conftest.py配置 3、修改pytest.ini文件 4、运行case 5、注意事项 1、修改插件pytest_playwright pytest_playwright.py内容如下&#xff1a; # Copyright (c) Microsoft Corporation. # # Licensed under the Apache License, Ver…

Maven package classifier测试

package package阶段会生成一个jar文件&#xff0c;包含了main文件夹下编译后的资源。可作为其他项目的依赖引用。 classifier install后&#xff0c;在仓库中存放的artifact的最终文件&#xff0c;即将package最终文件存入仓库&#xff0c;若在打包时需要加以定制&#xff…

双目的Occupancy——Occdepth

文章目录 论文链接&#xff1a;[https://arxiv.org/pdf/2302.13540.pdf](https://arxiv.org/pdf/2302.13540.pdf)、代码链接&#xff1a; [https://github.com/megvii-research/OccDepth](https://github.com/megvii-research/OccDepth) 网络结构&#xff1a;Stereo moudule 通…

政策导向与行业发展

方向一&#xff1a;政策导向与行业发展 政府工作报告中对计算机行业的政策导向主要包括促进信息技术与实体经济深度融合、推动数字化转型升级、加强网络安全和数据保护等。这些政策的出台将直接影响着计算机行业的发展方向和企业的经营策略。 首先&#xff0c;政府将进一步推…

【线段树二分】第十三届蓝桥杯省赛C++ A组/研究生组 Python 研究生组《扫描游戏》(C++)

【题目描述】 有一根围绕原点 O 顺时针旋转的棒 OA&#xff0c;初始时指向正上方&#xff08;Y 轴正向&#xff09;。 在平面中有若干物件&#xff0c;第 i 个物件的坐标为&#xff08;,)&#xff0c;价值为 。 当棒扫到某个物件时&#xff0c;棒的长度会瞬间增长 &#xff…