C语言教程——文件处理(1)

目录

前言

二、什么是文件

2.1文件的概念

2.2程序文件

2.3数据文件

2.4文件名

2.5二进制文件和文本文件

三、文件操作

3.1文件指针

3.2文件的打开与关闭

四、文件的顺序读写

4.1fgetc

4.2fputc

4.3fputs

4.4fgets

总结


前言

我们知道电脑上有许许多多的文件,但为什么数据要用文件来储存呢?为什么要使用文件呢?且待我细细道来。


一、为什么使用文件

我们知道,我们写的程序什么的数据什么的都存在文件中,倘若没有存在文件中,那么它们就存在了电脑的内存中,而且如果程序退出的话,内存就会进行回收,我们的数据就也回收了,也就丢失了,等到程序再次运行,是看不见上次程序的数据的,如果将数据进行持久化的保存,我们就可以使用文件。

二、什么是文件

2.1文件的概念

磁盘(硬盘)上的文件是文件。文件是计算机中的一种数据存储形式,用来存储和组织数据的集合。文件可以包含文本、图像、音频、视频等各种形式的数据。在计算机系统中,文件通常以扩展名作为标识,不同的扩展名代表不同的文件类型。文件可以存储在计算机的硬盘、固态硬盘、光盘等各种存储介质上,并可以通过操作系统提供的文件系统进行读取、写入、复制、移动等操作。

但是在程序设计中,我们一般谈的文件有两种:程序文件、数据文件(从文件功能的角度来分类的)。

2.2程序文件

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

2.3数据文件

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

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

2.4文件名

一个文件要有一个唯一的文件标识,以便用户识别和引用。文件名包含3个部分:文件路径+文件名主干+文件后缀

例如:D:\仓库code\lianxi.c

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

2.5二进制文件和文本文件

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

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

三、文件操作

3.1文件指针

缓冲文件系统中,主要的就是“文件类型指针”,也就是“文件指针”。每一个文件在内存中都会开辟一个文件信息区,用来存放文件的相关信息(如文件的名字,文件状态以及文件当前的位置等等)。这些信息是保存在一个结构体变量中的。该结构体类型是由系统声明的,取名为FILE。

不同的编译器不同环境stdio.h头文件中的文件类型申明是不一样的:

我们可以看到VS2022中对于FILE的申明定义。下面是VS2013中对FILE的申明定义:

struct _iobuf {
char *_ptr;
int _cnt;
char *_base;
int _flag;
int _file;
int _charbuf;
int _bufsiz;
char *_tmpfname;
};
typedef struct _iobuf FILE;

可以看到FILE其实就是一个包含各种成员的结构体,我们不需要这些成员都是什么,我们只需要会使用FILE就可以。

我们一般都是用一个FILE的指针来维护这个FILE结构的变量,这样比较方便。

我们可以创建一个FILE* 的指针变量:

FILE* pf;

 这里就使用FILE创建了一个pf的指针,也就是文件指针变量。定义pf就是一个指向FILE类型数据的指针变量,可以使用pf,指向某一个文件的文件信息区,通过文件信息区中的信息就可以访问数据,也就是说通过文件指针变量就可以间接的找到与它关联的文件。

3.2文件的打开与关闭

文件在读取之前应该打开文件,读取完了之后应该关闭文件。文件打开的时候,会返回一个FILE*的指针变量指向该文件,也相当于建立的文件和指针的关系。

C语言中规定使用fopen函数来打开文件,fclose来关闭文件。

FILE * fopen ( const char * filename, const char * mode );

fopen里面第一个参数是文件名也就是文件的地址,地址可以用绝对地址或者是相对地址。第二个参数是以什么方式访问文件。

这里可以通过以下的方式访问:

read:打开文件进行输入操作。该文件必须存在。write:为输出操作创建一个空文件。如果同名的文件已经存在,则其内容将被丢弃,并将该文件视为新的空文件。“a”append:打开文件以便在文件末尾输出。输出操作总是在文件末尾写入数据,展开它。重定位操作(fseek, fsetpos, rewind)将被忽略。如果文件不存在,则创建该文件。“r+”read/update:打开一个文件进行更新(包括输入和输出)。该文件必须存在。“w+”write/update:创建一个空文件并打开它进行更新(输入和输出)。如果同名文件已经存在,其内容将被丢弃,并将该文件视为新的空文件。“a+”append/update:打开一个文件进行更新(包括输入和输出),所有输出操作都在文件末尾写入数据。重定位操作(fseek、fsetpos、rewind)会影响下一个输入操作,但输出操作会将位置移回文件末尾。如果文件不存在,则创建该文件。

⽂件使⽤⽅式含义如果指定⽂件不存在
“r”(只读)为了输⼊数据,打开⼀个已经存在的⽂本⽂件出错
“w”(只写)为了输出数据,打开⼀个⽂本⽂件建⽴⼀个新的⽂件
“a”(追加)向⽂本⽂件尾添加数据建⽴⼀个新的⽂件
“rb”(只读)为了输⼊数据,打开⼀个⼆进制⽂件出错
“wb”(只写)为了输出数据,打开⼀个⼆进制⽂件建⽴⼀个新的⽂件
“ab”(追加)向⼀个⼆进制⽂件尾添加数据建⽴⼀个新的⽂件
“r+”(读写)为了读和写,打开⼀个⽂本⽂件出错
“w+”(读写)为了读和写,建议⼀个新的⽂件建⽴⼀个新的⽂件
“a+”(读写)打开⼀个⽂件,在⽂件尾进⾏读写建⽴⼀个新的⽂件
“rb+”(读写)为了读和写打开⼀个⼆进制⽂件出错
“wb+”(读写)为了读和写,新建⼀个新的⼆进制⽂件建⽴⼀个新的⽂件
“ab+”(读写)打开⼀个⼆进制⽂件,在⽂件尾进⾏读和写建⽴⼀个新的⽂件
int fclose ( FILE * stream );

fclose就是把之前用来接收的指针传进去,就关闭了。

If the stream is successfully closed, a zero value is returned.
On failure, EOF is returned.

我们可以看到,如果关闭成功最后返回的就是0,如果关闭失败那么返回的就是EOF。

这样我们就可以通过代码来简单的演示一下:
 

我们可以首先在D盘project目录下创建一个text.tst文件,之后同过代码来访问:

#include<stdio.h>
int main()
{FILE* df = fopen("D:\\project\\text.txt","r");if (df == NULL){perror("FILE::");return 1;}else{printf("访问成功!\n");}int i=fclose(df);if (i == 0){df = NULL;return 0;}elseperror("fclose::");return 0;
}

这里就是通过read的方式访问这个text,当然是访问到了,所以最后会打印访问成功,而且也关闭成功。

我们如果把那个text删除,看看运行结果如何:

这时候就会说FILE打开文件这块没有这个文件或者目录。

基于fopen和fclose就可以实现文件的打开和关闭。如果方式变为“w”,那么会把之前里面的数据进行清除,把上一次的信息都销毁掉。

四、文件的顺序读写

函数名功能适⽤于
fgetc字符输⼊函数所有输⼊流
fputc字符输出函数所有输出流
fgets⽂本⾏输⼊函数所有输⼊流
fputs⽂本⾏输出函数所有输出流
fscanf格式化输⼊函数所有输⼊流
fprintf格式化输出函数所有输出流
fread⼆进制输⼊⽂件输⼊流
fwrite⼆进制输出⽂件输出流

当我们可以打开关闭文件了,就可以实现对文件里面顺序读写。

4.1fgetc

int fgetc ( FILE * stream );

这是读取获得单个字符

返回值:

成功后,将返回字符 read(提升为 int 值)。
返回类型为 int 以容纳特殊值 EOF,该值指示失败:
如果位置指示符位于文件末尾,则函数返回 EOF 并设置 stream 的 eof 指示符 (feof)。
如果发生其他读取错误,该函数还会返回 EOF,但会设置其错误指示符 (ferror)。

我们把之前的文件还原,在text.txt文件里写入abcdef,这里用fgetc函数来获取字符:

int main()
{//打开文件FILE* df = fopen("D:\\project\\text.txt","r");if (df == NULL){perror("FILE::");return 1;}else{printf("访问成功!\n");}//读取int j = 0;j = fgetc(df);printf("%c", j);j = fgetc(df);printf("%c", j);j = fgetc(df);printf("%c", j);//关闭文件int i=fclose(df);if (i == 0){df = NULL;return 0;}elseperror("fclose::");return 0;
}

运行结果:
 

这样就获取字符成功了。

4.2fputc

int fputc ( int character, FILE * stream );

这里第一个参数是要写的字符,第二个参数是要写入的目标文件

返回值:

On success, the character written is returned.
If a writing error occurs, EOF is returned and the error indicator (ferror) is set.

​​如果成功,则返回所写的字符。
如果发生写错误,则返回EOF并设置错误指示器(error)。

我们也可以用代码来写一下,把访问方式改成"w",可以覆盖掉之前的数据:

//打开文件
FILE* df = fopen("D:\\project\\text.txt","w");
//输入字符
char j = 'a';
for (j = 'a'; j <= 'z'; j++)
{fputc(j, df);
}

这里用一个循环实现输入a到z,我们打开txt可以看到成功了:

4.3fputs

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

fputs函数是输入一个字符串,可以把字符串输入到文件中。第一个参数是要输入的字符串,第二个参数是目标文件。

我们就直接上代码:

//打开文件
FILE* df = fopen("D:\\project\\text.txt","w");
fputs("hello world\n", df);

我们往之前的文件中写入hello world。运行程序后:

发现之前的被覆盖,成功的输入进去了新的字符串。

4.4fgets

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

fgets是读取获得一个字符串,第一个参数是要把读取到的字符串存到的字符数组,第二个是要读取的个数,第三个是目标文件。

我们也直接代码演示:

//打开文件
FILE* df = fopen("D:\\project\\text.txt","r");
//输出字符串
char arr[20];
fgets(arr, 5, df);
printf("%s", arr);

这里就是读取5个字符存到arr数组中,并且打印出来:

这里为什么只有四个字母,因为它还要加上一个\0,也算一个,所以是五个。


总结

今天先到这里,,剩下的下一篇再继续写。

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

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

相关文章

【橘子ES】Kibana的分析能力Analytics简易分析

一、kibana是啥&#xff0c;能干嘛 我们经常会用es来实现一些关于检索&#xff0c;关于分析的业务。但是es本身并没有UI,我们只能通过调用api来完成一些能力。而kibana就是他的一个外置UI&#xff0c;你完全可以这么理解。 当我们进入kibana的主页的时候你可以看到这样的布局。…

c#的tabControl控件实现自定义标签颜色

最近项目需要自定义tabControl控件颜色&#xff0c;而默认这个控件是不支持自定义标签颜色的&#xff0c;于是想办法实现了这个功能&#xff0c;效果如下图所示&#xff1a; 直接上代码&#xff1a; using System; using System.Collections.Generic; using System.ComponentM…

从零到一:Spring Boot 与 RocketMQ 的完美集成指南

1.Rocket的概念与原理 RocketMQ 是一款由阿里巴巴开源的分布式消息中间件&#xff0c;最初用于支持阿里巴巴的海量业务。它基于发布-订阅模型&#xff0c;具备高吞吐、低延迟、高可用和强一致性的特点&#xff0c;适用于消息队列、大规模数据流处理等场景。以下是对 RocketMQ …

Odoo免费开源ERP最佳业务实践:生产管理

文 / 开源智造&#xff08;OSCG&#xff09; Odoo亚太金牌服务 概述 Odoo是全球排名第一的免费开源ERP系统&#xff0c;以其强大的功能和模块化设计著称&#xff0c;适用于各种规模及类型的企业。Odoo集成了生产、采购、销售、库存、财务、人力资源、市场营销、电子商务等多个…

1.CSS的三大特性

css有三个非常重要的三个特性&#xff1a;层叠性、继承性、优先级 1.1 层叠性 想通选择器给设置想听的样式&#xff0c;此时一个样式就会覆盖&#xff08;层叠&#xff09;另一个冲突的样式。层叠性主要是解决样式冲突的问题。 <!DOCTYPE html> <html lang"en&…

【2024年华为OD机试】(A卷,200分)- 优雅子数组 (JavaScriptJava PythonC/C++)

一、问题描述 题目描述 如果一个数组中出现次数最多的元素出现大于等于 k 次&#xff0c;被称为 k-优雅数组&#xff0c;k 也可以被称为优雅阈值。 例如&#xff1a; 数组 [1, 2, 3, 1, 2, 3, 1] 是一个 3-优雅数组&#xff0c;因为元素 1 出现次数大于等于 3 次。数组 [1,…

电子应用设计方案102:智能家庭AI鱼缸系统设计

智能家庭 AI 鱼缸系统设计 一、引言 智能家庭 AI 鱼缸系统旨在为鱼类提供一个健康、舒适的生活环境&#xff0c;同时为用户提供便捷的管理和观赏体验。 二、系统概述 1. 系统目标 - 自动维持水质稳定&#xff0c;包括水温、酸碱度、硬度和溶氧量等关键指标。 - 智能投食&…

智能化加速标准和协议的更新并推动验证IP(VIP)在芯片设计中的更广泛应用

作者&#xff1a;Karthik Gopal, SmartDV Technologies亚洲区总经理 智权半导体科技&#xff08;厦门&#xff09;有限公司总经理 随着AI技术向边缘和端侧设备广泛渗透&#xff0c;芯片设计师不仅需要考虑在其设计中引入加速器&#xff0c;也在考虑采用速度更快和带宽更高的总…

Vue3.5 企业级管理系统实战(三):页面布局及样式处理 (Scss UnoCSS )

本章主要是关于整体页面布局及样式处理&#xff0c;在进行这一章代码前&#xff0c;先将前两章中的示例代码部分删除&#xff08;如Home.vue、About.vue、counter.ts、App.vue中引用等&#xff09; 1 整体页面布局 页面整体布局构成了产品的框架基础&#xff0c;通常涵盖主导…

Linux 消息队列的使用方法

文章目录 1.概念2. 创建消息队列3. 发送消息4. 接收消息5. 消息结构体6. 消息队列控制&#xff08;删除、获取队列状态&#xff09;消息队列是否存在7. 使用场景8. 注意事项使用例子判断消息队列是否存在的代码获取队列空间大小 1.概念 消息队列是一种进程间通信 (IPC) 机制&a…

低代码可视化-转盘小游戏可视化-代码生成器

转盘小程序是一种互动工具&#xff0c;它通过模拟真实的转盘抽奖或决策体验&#xff0c;为用户提供了一种有趣且公平的选择方式。以下是对转盘小程序的详细介绍&#xff1a; 转盘小程序的应用场景 日常决策&#xff1a;转盘小程序可以帮助用户解决日常生活中的选择困难问题&a…

【Prometheus】Prometheus如何监控Haproxy

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

仅仅4M!windows系统适用,免费无限制使用!

软件介绍 在日常生活里&#xff0c;我们经常会碰到电脑运行迟缓、网速卡顿的现象&#xff0c;却又不清楚是哪个程序在占用过多资源。这种时候&#xff0c;一款能实时监测网络和系统状态的工具就变得非常关键了。今天呢&#xff0c;就给大家介绍一个小巧又实用的监控工具——「T…

计算机毕业设计hadoop+spark+hive图书推荐系统 豆瓣图书数据分析可视化大屏 豆瓣图书爬虫 知识图谱 图书大数据 大数据毕业设计 机器学习

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

Harmony Next 支持创建分身

应用分身能实现在一个设备上安装多个相同的应用&#xff0c;实现多个账号同时登录使用和运行并且互不影响。主要应用场景有社交账号双开、游戏大小号双开等&#xff0c;无需账号切换&#xff0c;从而省去频繁登录的繁琐。 Harmony Next 很容易就能让 App 支持创建分身。 官方文…

Linux下 date时间应该与系统的 RTC(硬件时钟)同步

发现客户服务器时间与真实时间不同&#xff0c;并且服务器没有网络。 解决办法&#xff1a;时间应该与系统的 RTC&#xff08;硬件时钟&#xff09;同步 手动设置系统时间 使用 date 命令将系统时间设置为 2025年01月21日 14:12:00&#xff1a; sudo date --set"2025-01…

XX污水处理厂基于RK3576核心板应用(四)——人员倒地智能识别系统方案

通过 SAIL-RK3576核心板 支撑的 人员倒地识别系统&#xff0c;污水处理厂能够在广阔、复杂的区域内实时监控人员安全&#xff0c;实现意外倒地等事故的秒级响应与干预。搭配多元人形动态监测机制&#xff0c;还可进一步拓展对其他异常动作或不安全行为的识别&#xff0c;持续保…

【IEEE Fellow 主讲报告| EI检索稳定】第五届机器学习与智能系统工程国际学术会议(MLISE 2025)

重要信息 会议时间地点&#xff1a;2025年6月13-15日 中国深圳 会议官网&#xff1a;http://mlise.org EI Compendex/Scopus稳定检索 会议简介 第五届机器学习与智能系统工程国际学术会议将于6月13-15日在中国深圳隆重召开。本次会议旨在搭建一个顶尖的学术交流平台&#xf…

css粘性定位超出指定宽度失效问题

展示效果 解决办法&#xff1a;外层容器添加display:grid即可 完整代码 <template><div class"box"><div class"line" v-for"items in 10"><div class"item" v-for"item in 8">drgg</div>&…

随机变量的变量替换——归一化流和直方图规定化的数学基础

变量替换是一种在统计学和数学中广泛应用的技术&#xff0c;它通过定义新的变量来简化问题&#xff0c;使得原本复杂的随机变量变得更加容易分析。 变量替换的公式&#xff0c;用于将一个随机变量 X X X 的概率密度函数 f X f_X fX​ 转换为其经过函数 g g g 变换后的随机变…