1. 为什么使用文件

不使用文件,我们所写的程序存在电脑内存中,程序结束,内存回收,数据就丢失了。再次运行程序也是看不到上次运行时的数据的,如果想要将数据进行持久化保存,就需要使用文件。

2. 文件分类(包含关系)

2.1 文件名

一个文件要有一个唯一的识别标识,以便用户识别和引用。

文件名包含三部分:文件路径+文件名主干+文件后缀。

为方便起见,文件标识常被称为文件名

磁盘(硬盘)上的内容称为文件。在程序设计中,我们谈到的文件有两种,程序文件数据文件。程序文件有数据文件又有文本文件二进制文件之分。

2.2 各类文件定义

2.2.1 程序文件

程序文件是计算机程序相关文件的统称,包括源程序文件(后缀为.c .cpp其他编程语言还有.java .py)、目标文件(windows环境后缀为.obj)、可执行文件(后缀为.exe)等等。

2.2.2 数据文件

文件的内容不一定是程序,而是程序运行时读写的数据,比如程序运行需要从中读取数据的文件,或者输出内容的文件。在以前各章所处理数据的输入输出都是以终端为对象的,即从终端的键盘输入数据,运行结果显示到显示器上。其实有时候我们会把信息输出到磁盘上,当需要的时候再从磁盘上把数据读取到内存中使用,这里处理的就是磁盘上文件,也就是数据文件。根据数据的组织形式,数据文件被称为文本文件或者二进制文件。

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

文本文件;如果要求在外存上以ASCI码的形式存储,则需要在存储前转换。以ASCI字符的形式存储的文件就是文本文件。
一个数据在文件中是怎么存储的呢?
字符一律以ASCII形式存储,数值型数据既可以用ASCII形式存储,也可以使用二进制形式存储。如有整数10000,如果以ASCII码的形式输出到磁盘,则磁盘中占用5个字节(每个字符一个字节),而二进制形式输出,则在磁盘上只占4个字节。

3. 文件如何打开和关闭的?

3.1 流和标准流

3.1.1 流的定义

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

3.1.2 标准流

为什么我们从键盘输入数据,向屏幕上输出数据,并没有打开流呢?

那是因为C语言程序在启动的时候,默认打开了3个流:

stdin:标准输入流,在大多数的环境中从键盘输入,scanf函数就是从标准输入流中读取数据

stdout:标准输出流,大多数的环境中输出至显示器界面,printf函数就是将信息输出到标准输出流中
stderr:标准错误流,大多数环境中输出到显示器界面

这是默认打开了这三个流,我们使用scanf、printf等函数就可以直接进行输入输出操作的。stdin、stdout、stderf三个流的类型是:"FILE*,通常称为文件指针。C语言中,就是通过:FILE*的文件指针来维护流的各种操作的。

3.2 文件指针

缓冲文件系统中,关键的概念是“文件类型指针”,简称“文件指针”。每个被使用的文件都在内存中开辟了一个相应的文件信息区,用来存放文件的相关信息(如文件的名字,文件状态及文件当前的位置等)。这些信息是保存在一个结构体变量中的。该结构体类型是由系统声明的,重命名为FILE。不同编译器中FILE类型不完全相同,但大同小异。

每打开一个文件,系统会根据文件情况自动创建一个FILE结构的变量,自动填充其中的信息,并返回一个FILE*的指针指向该变量,使用者不必关心结构体内容细节。我们可以通过FILE*的指针找到对应文件的文件信息区(FILE类型的结构体),通过文件信息区就可以访问该文件。

3.3 文件的打开和关闭(fopen、fclose)

文件在读写之前应该先打开文件,使用结束之后应该关闭文件。打开文件就会自动返回一个FILE*类型的指针,建立了指针和文件的关系。ANSIC规定使用fopen函数打开文件,fclose关闭文件。

//打开文件
FILE * fopen ( const char * filename, const char * mode );//关闭文件
int fclose ( FILE * stream );

fopen第一个参数是一个字符串,内容是:文件名,第二个参数mode表示文件打开模式。

             

4. 文件顺序读写

4.1 各类输入输出函数图解

函数功能适用于
fgetc字符输入函数所以输入流
fputc字符输出函数所以输出流
fgets文本行输入函数所以输入流
fputs文本行输出函数所以输出流
fscanf格式化输入函数所以输入流
fprintf格式化输出函数所以输出流
fread二进制输入文件输入流
fwrite二进制输出文件输入流

4.2 各类输入输出函数介绍

注:stream指向输入(出)流的FILE对象的指针

4.2.1 fgetc

int fgetc ( FILE * stream );

 从流中获取当前字符,并推进位置指示器+1

如果调用时流处于文件末尾或发生错误,返回EOF并设置流的末尾(错误)指示器

4.2.2 fputc

int fputc ( int character, FILE * stream );

 将字符写入流,并推进位置指示器+1

character存放字符的整型提升,在写入时转变为无符号字符

成功写入返回写入的字符,失败返回EOF并设置错误指示器(ferror)

4.2.3 fgets

char * fgets ( char * str, int num, FILE * stream );

 从流中读取字符并将其存储到str中,直到(num-1)个字符或者到达换行符或者到文件末尾,使fgets停止读取,此字符(换行符或其他字符)也会作为有效字符复制到str中,同时最后一个字符放终止空字符'\0'

成功时返回str,发生错误,返回NULL,设置错误指示器(ferror)

4.2.4 fputs

int fputs ( const char * str, FILE * stream );

将str中的字符串写入流 ,从指定的地址开始(字符串首元素地址),复制直到终止空字符'\0'为止,终止空字符不会复制到流中

成功时返回一个非负值,失败返回EOF并设置错误指示器(ferror)

4.2.5 fscanf

int fscanf ( FILE * stream, const char * format, ...(附加参数) );

与scanf函数类似,scanf是从标准输入流(stdin)中读取格式化数据而fscanf是从所以输入流(标准和文件输入流)中读取格式化数据,并根据参数格式将他们存储到附件参数指向的位置

成功后,函数返回成功填充的参数列表的项数,读取发生错误或读到文件末尾,返回EOF

4.2.6 fprintf

int fprintf ( FILE * stream, const char * format, ... );

与printf函数类似,printf是向标准输出流(stdout)中输出格式化数据而fprintf是向所有输出流(标准和文件输出流)中输出格式化数据

成功后,返回写入的字符总数,发生错误,返回负数

:sscanf函数是从字符串中读取格式化数据。

sprintf函数是将格式化数据输出到一个字符串中。

4.2.7 fread

fread和fwrite中参数:ptr是待写入(读取)的数组的指针;size是单个元素的大小;count是元素的个数。

size_t fread ( void * ptr, size_t size, size_t count, FILE * stream );

从文件输入流中读取count个大小为size的元素放在ptr数组中

返回成功写入的元素总数,如果写入元素总数与count不同,会写入错误阻止函数完成

4.2.8 fwrite

size_t fwrite ( const void * ptr, size_t size, size_t count, FILE * stream );

 将ptr数组中count个大小为size的元素输出到文件输出流中

返回成功写入的元素总数,如果写入元素总数与count不同,会写入错误阻止函数完成

5. 文件随机读写

5.1 fseek

int fseek ( FILE * stream, long int offset, int origin );

offset是从origin位置偏移的字节数;

origin是源位置,有三种选择:

SEEK_SET:文件起始位置

SEEK_CUR:文件当前位置

SEEK_END:文件末尾

重新定义流位置指示器,如果成功返回0,否则返回非0值

5.2 ftell

long int ftell ( FILE * stream );

 返回位置指示器相对于起始位置的偏移量,失败返回-1L(长整型的-1)并设置errno

5.3 rewind

void rewind ( FILE * stream );

 让位置指示器回到文件起始位置,无返回值

7. 文件读取结束判断

7.1 feof作用

feof作用是当文件读取结束时,判断文件读取结束是不是因为遇到文件末尾(也就是检测有没有设置末尾指示器)。

不能用feof的返回值直接判断函数文件读取是否结束

附:ferror可以判断文件读取结束是不是因为遇到错误(也就是检查有没有设置错误指示器)。

7.2 如何判断文件读取是否结束

文本文件可以判断返回值是否为EOF(fgetc)或为NULL(fgets)

二进制文件可以返回值是否小于实际要读个数

 示例:文本文件

#include <stdio.h>
#include <stdlib.h>int main(void)
{int c = 0; // 注意:int,⾮char,要求处理EOFFILE* fp = fopen("test.txt", "r");if(fp == NULL) {perror("File opening failed");return;}//fgetc 当读取失败的时候或者遇到⽂件结束的时候,都会返回EOFwhile ((c = fgetc(fp)) != EOF) { putchar(c);}//判断是什么原因结束的//ferror遇到错误会返回一个非0值//feof遇到文件末尾会返回一个非0值if (ferror(fp))puts("Error when reading");else if (feof(fp))puts("End of file reached successfully");fclose(fp);
}

8. 文件缓冲区

ANSIC 标准采用“缓冲文件系统”处理的数据文件的,所谓缓冲文件系统是指系统自动地在内存中为程序中每一个正在使用的文件开辟一块“文件缓冲区”。从内存向磁盘输出数据会先送到内存中的缓冲区,装满缓冲区后才一起送到磁盘上。如果从磁盘向计算机读入数据,则从磁盘文件中读取数据输入到内存缓冲区(充满缓冲区),然后再从缓冲区逐个地将数据送到程序数据区(程序变量等)。缓冲区的大小根据C编译系统决定的。文件缓冲区的存在一定程度上让操作系统更高效。

因为有缓冲区的存在,C语言在操作文件的时候,需要做刷新缓冲区或者在文件操作结束的时候关闭文件(关闭文件也是一次文件缓冲区的刷新)。如果不做,可能导致读写的问题。

fflush函数可以刷新文件缓冲区。

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

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

相关文章

unbuntn 22.04 coreutils文件系统故障

文章目录核心思路具体操作步骤&#xff08;需借助 Ubuntu Live USB&#xff09;1. 准备 Ubuntu Live USB2. 从 Live USB 启动并挂载系统分区3. 从安装包中提取完好的 /bin/dir 文件并替换4. 重启系统并验证总结前提说明具体操作步骤&#xff08;分阶段执行&#xff09;阶段1&am…

若依【(前后端分离版)SpringBoot+Vue3】

文章目录什么是若依使用若依验证码的前端实现&#x1f4cc; 前后端验证码流程说明文档1、前端初始化验证码2、前端界面显示3、后端生成验证码接口&#xff08;GET /captchaImage&#xff09;4、用户提交登录信息5、后端验证验证码逻辑&#xff08;POST /login&#xff09;6、登…

Ubuntu24安装MariaDB/MySQL后不知道root密码如何解决

Ubuntu 24.04 安装 MariaDB 后 root 密码未知&#xff1f;解决方案在此在 Ubuntu 24.04 上新安装 MariaDB 后&#xff0c;许多用户会发现自己不知道 root 用户的密码&#xff0c;甚至在安装过程中也没有提示设置密码。这是因为在较新的 MariaDB 版本中&#xff0c;默认情况下 r…

Cloudflare CDN 中设置地域限制并返回特定界面

文章目录 什么是CDN 什么是Cloudflare 注册Cloudflare 账号,添加域名、修改DNS并激活邮箱 阻止或允许特定国家或地区访问 常见规则表达式 WAF自定义规则 + 自定义错误页面 使用Workers脚本 什么是CDN CDN 是一种优化网站请求处理的机制。它是在用户访问网站 (服务器) 时用户与…

Ubuntu高频实用命令大全

Ubuntu系统中高频实用命令 以下为Ubuntu系统中高频实用命令的分类整理,涵盖系统管理、文件操作、网络配置等场景,每个命令附带简要说明: 系统信息与管理 uname -a 显示系统内核版本、主机名等详细信息。 lsb_release -a 查看Ubuntu发行版版本信息。 uptime 显示系统运行时…

关于C#的编程基础:数据类型与变量全解析

一.基本的数据类型 1.什么是数据类型 在编程语言中&#xff0c;数据类型&#xff08;Data Type&#xff09; 是对变量存储的 “数据的种类” 的定义&#xff0c;它决定了&#xff1a; 变量可以存储哪些值&#xff08;例如整数、文本、布尔值&#xff09;。这些值在内存中如何…

深入解析 Spring 获取 XML 验证模式的过程

关键要点Spring 的 XML 验证模式&#xff1a;Spring 框架在加载 XML 配置文件时&#xff0c;会根据文件内容判断使用 DTD&#xff08;文档类型定义&#xff09;或 XSD&#xff08;XML 模式定义&#xff09;进行验证。自动检测机制&#xff1a;Spring 默认使用自动检测&#xff…

复现《Local GDP Estimates Around the World》论文的完整指南

复现《Local GDP Estimates Around the World》论文的完整指南 1. 引言 1.1 论文概述 《Local GDP Estimates Around the World》是一篇重要的经济地理学研究论文&#xff0c;作者提出了一种创新的方法来估计全球范围内次国家层面的GDP数据。这项工作填补了全球经济发展研究中子…

Sql注入 之sqlmap使用教程

一、安装sqlmap 浏览器访问SQLmap官网 即可下载工具&#xff1b;需要说明的是&#xff0c;SQLmap运行依赖于python环境&#xff0c;所以在下载使用前务必在电脑及终端上安装好python环境。 通过网盘分享的文件&#xff1a;sqlmap-master.zip链接: https://pan.baidu.com/s/1YZi…

安宝特案例丨户外通信机房施工革新:AR+作业流技术破解行业难题

在数字化浪潮席卷各行各业的今天&#xff0c;传统户外通信机房建设领域正经历一场静悄悄的变革。作为信息社会的“神经枢纽”&#xff0c;户外机房的质量直接关系到通信网络的稳定性&#xff0c;但长期以来&#xff0c;这一领域却深受施工标准化不足、质量管控难、验收追溯复杂…

在 CentOS 中安装 MySQL 的过程与问题解决方案

MySQL 是一款广泛使用的开源关系型数据库管理系统&#xff0c;在 CentOS 系统中安装 MySQL 是很多开发者和运维人员常做的工作。下面将详细介绍安装过程以及可能遇到的问题和解决方案。 一、安装前的准备工作 在安装 MySQL 之前&#xff0c;需要做好一些准备工作&#xff0c;…

阿里 Qwen3 四模型齐发,字节 Coze 全面开源,GPT-5 8 月初发布!| AI Weekly 7.21-7.27

&#x1f4e2;本周AI快讯 | 1分钟速览&#x1f680;1️⃣ &#x1f9e0; 阿里 Qwen3 全系列爆发 &#xff1a;一周内密集发布四款新模型&#xff0c;包括 Qwen3-235B-A22B-Thinking-2507、Qwen3-Coder 和 Qwen3-MT&#xff0c;MMLU-Pro 成绩超越 Claude Opus 4&#xff0c;百万…

C语言第 9 天学习笔记:数组(二维数组与字符数组)

C语言第09天学习笔记&#xff1a;数组&#xff08;二维数组与字符数组&#xff09; 内容提要 数组 二维数组字符数组二维数组 定义 二维数组本质上是一个行列式组合&#xff0c;由行和列两部分组成&#xff0c;属于多维数组&#xff0c;通过行和列解读&#xff08;先行后列&…

使用OpenCV做个图片校正工具

昨天有位兄台给我发了个文件&#xff0c;是下面这个样子的&#xff1a;那一双小脚既没有裹成三寸金莲&#xff0c;又没有黑丝&#xff0c;这图片肯定不符合我的要求。我要的是这个样子的好不好&#xff1a;让他拿扫描仪重新给我规规矩矩扫一个发过来&#xff1f;他要能用扫描仪…

《不只是接口:GraphQL与RESTful的本质差异》

RESTful API凭借其与HTTP协议的天然融合&#xff0c;以资源为核心的架构理念&#xff0c;在过去十余年里构建了Web数据交互的基本秩序&#xff1b;而GraphQL的出现&#xff0c;以“按需获取”为核心的查询模式&#xff0c;打破了传统的请求-响应逻辑&#xff0c;重新定义了前端…

博士招生 | 香港大学 招收人工智能和网络安全方向 博士生

学校简介香港大学创立于 1911 年&#xff0c;是香港历史最悠久的高等学府&#xff0c;QS 2025 世界排名第 17 位。计算机科学学科在 QS 2025 学科排名中位列全球第 31 位、亚洲第 5 位。计算机系&#xff08;Department of Computer Science&#xff09;下设系统、人工智能、数…

Linux知识回顾总结----基础IO

目录 1. 理解“文件” 1.1 文件的定义 2. 回顾 C 语言的文件操作 2.1 文件操作 2.2 实现cat 2.3 可以实现打印的几种方式 3. 系统文件的IO 3.2 使用系统的接口 3.3 内部的实现 3.4 重定向 4. 文件系统的内核结构 5. 缓冲区 5.1 是什么 5.2 为什么 5.3 有什么 5.4 见见…

网络:基础概念

网络&#xff1a;基础概念 在计算机发展过程中&#xff0c;最开始每个计算机时相互独立的&#xff0c;后来人们需要用计算机合作处理任务&#xff0c;这就牵扯到了数据交换&#xff0c;所以最开始的网络就诞生了。一开始&#xff0c;网络都是局域网LAN&#xff0c;后来技术成熟…

图像识别边缘算法

文章目录1. 基本概念2. 边缘检测原理边缘类型&#xff1a;3. 常见边缘检测算法3.1 Sobel算子3.2 Canny边缘检测3.3 Laplacian算子4. Canny边缘检测详细流程流程图示例&#xff1a;详细步骤说明&#xff1a;5. 边缘检测算法比较6. 参数调优建议Canny边缘检测参数&#xff1a;Sob…

【Java Web实战】从零到一打造企业级网上购书网站系统 | 完整开发实录(终)

&#x1f9ea; 测试与质量保证 &#x1f50d; 全方位测试体系 我建立了企业级的全方位测试体系来确保系统质量&#xff1a; &#x1f9ea; 测试金字塔模型 #mermaid-svg-u4I8UuUAyxJVjcqs {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill…