目录

  • 1 文件的概念
  • 2 程序文件和数据文件
  • 3 二进制文件和文本文件
  • 4 流
    • 4.1 流的概念
    • 4.2 标准流
  • 5 文件信息区和文件指针
  • 6 处理文件的库函数
    • 6.1 fopen
    • 6.2 fclose
    • 6.3 fgetc
    • 6.4 fputc
    • 6.5 fgets
    • 6.6 fputs
    • 6.7 fscanf
    • 6.8 fprintf
    • 6.9 fread
    • 6.10 fwrite
    • 6.11 fseek
    • 6.12 ftell
    • 6.13 rewind
    • 6.14 feof 和 ferror
  • 7 文件缓冲区

1 文件的概念

在磁盘中,用于保存数据的工具就是文件
比如,下图的 test.txt 就是一个文件,保存了 1 2 3 4 5 6 7 8 9 10 这样的数据
在这里插入图片描述
在这里插入图片描述

2 程序文件和数据文件

从程序设计的角度上来说,文件主要分为程序文件和数据文件
程序文件:用于保存程序代码的文件,比如.c后缀的源文件,.h后缀的头文件
数据文件:用于保存其它数据的文件,比如上文提到的 test.txt 文件

3 二进制文件和文本文件

在C语言编程中,对文件进行操作时,主要有二进制文件和文本文件两个对象,它们都属于数据文件
文本文件:数据在保存到文件时,会先将该数据按字节为单位转换为字符,再以ASCII码的形式保存
二进制文件:数据在保存到文件时,会直接以二进制序列的形式保存

举例:1000在文本文件和二进制文件中的不同保存形式

在这里插入图片描述

4 流

4.1 流的概念

由于计算机在运行时,会与各种各样的外部设备交流,所以这会使得程序员需要掌握这些设备的输入输出方式,对程序员的要求大大提高,为避免这种现象的发生,提出了流的概念,流向程序员提供了一种便捷的输入输出方式,程序员只需要通过流,就可以直接与外部设备进行交互,不需要关心具体输入输出的细节

在这里插入图片描述

4.2 标准流

标准流主要有3个,分别是 stdin,stdout,stderr
stdin:标准输入流,用来从键盘上读取数据,scanf 所使用的流就是它
stdout:标准输出流,用来向屏幕输出数据,printf 所使用的流就是它
stderr:标准错误流,用来在屏幕上显示错误信息

C语言的程序启动时,默认就开启了这三个流

5 文件信息区和文件指针

打开文件时,会在内存中生成一个文件信息区,文件信息区本质是一个结构体(名为FILE),保存了文件的各种信息
用户可以通过指向文件信息区的文件指针来访问对应的文件,文件指针的类型为FILE*
在这里插入图片描述

6 处理文件的库函数

6.1 fopen

fopen 的函数声明如下:

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

功能
打开一个文件

参数
filename 指要打开的文件的名称
mode 指文件的打开方式

返回值
若文件打开成功,则会返回指向该文件文件信息区的文件指针
若文件打开失败,则会返回空指针

文件的打开方式

功能文件不存在时
“r”指定本次打开要进行 读文件 操作,对象为文本文件出错
“w”指定本次打开要进行 写文件 操作并清空文件数据,对象为文本文件创建新文件
“a”在文件末尾添加新内容,对象为文本文件创建新文件
“rb”指定本次打开要进行 读文件 操作,对象为二进制文件出错
“wb”指定本次打开要进行 读文件 操作,对象为二进制文件创建新文件
“ab”在文件末尾添加新内容,对象为二进制文件创建新文件
“r+”指定本次打开要进行 读文件和写文件 操作,对象为文本文件出错
“w+”指定本次打开要进行 读文件和写文件 操作,对象为文本文件创建新文件
“a+”在文件末尾添加新内容,对象为文本文件创建新文件
“rb+”指定本次打开要进行 读文件和写文件 操作,对象为二进制文件出错
“wb+”指定本次打开要进行 读文件和写文件 操作,对象为二进制文件创建新文件
“ab+”在文件末尾添加新内容,对象为二进制文件创建新文件

举例:以读的形式,打开一个名为 “test.txt” 的文本文件

#include <stdio.h>
int main()
{FILE* pf = fopen("test.txt", "r"); //以读的方式打开文件if (pf == NULL) //防止使用空指针assert(pf);fclose(pf); //关闭文件pf = NULL;return 0;
}

6.2 fclose

int fclose ( FILE * stream );

功能
用于关闭打开的文件

参数
stream 为指向要关闭文件的文件指针

6.3 fgetc

int fgetc ( FILE * stream );

功能
用来从文件中获取一个字符

参数
stream 为指向要读取文件的文件指针

返回值
若读取成功,返回读取到的字符
若读取失败或者遇到文件末尾,返回EOF

举例:从文件中读取一个字符并输出

#include <stdio.h>
#include <assert.h>
int main()
{FILE* pf = fopen("test.txt", "r");if (pf == NULL)assert(pf);printf("%c", (char)fgetc(pf));fclose(pf);pf = NULL;return 0;
}

6.4 fputc

int fputc ( int character, FILE * stream );

功能
用来向文件中写入字符

参数
character 为要写入的字符
stream 为指向要操作的文件的文件指针

返回值
若操作成功,则返回写入的字符
若操作失败,则返回EOF

举例:写一个字符到文件内

#include <stdio.h>
#include <assert.h>
int main()
{FILE* pf = fopen("test.txt", "w");if (pf == NULL)assert(pf);fputc('a', pf);fclose(pf);pf = NULL;return 0;
}

6.5 fgets

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

功能
用来从文件中读出 num-1 个字符,放入 str 指向的字符串内,最后自动补 ‘\0’

参数
str 为指向存放字符的字符串的指针
num 为要读的字符数量,实际读取数量为 num-1
stream 为指向要读的文件的文件指针

返回值
若操作成功,则返回存放读取字符的字符串首地址
若操作失败,则返回空指针

举例:读取文件中的 4 个字符到字符串内

#include <stdio.h>
#include <assert.h>
int main()
{FILE* pf = fopen("test.txt", "r");if (pf == NULL)assert(pf);char str[5] = " ";fgets(str, 5, pf);fclose(pf);pf = NULL;return 0;
}

6.6 fputs

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

功能
将字符串的内容写到文件中

参数
str 为指向字符串的指针
stream 为指向要写的文件的指针

返回值
操作成功时,返回非负值
操作失败时,返回EOF

举例:读取一个字符串到文件内

#include <stdio.h>
#include <assert.h>
int main()
{FILE* pf = fopen("test.txt", "w");if (pf == NULL)assert(pf);char str[20] = "hello world";fputs(str, pf);fclose(pf);pf = NULL;return 0;
}

6.7 fscanf

int fscanf ( FILE * stream, const char * format, parameterList );

功能
根据给出的格式,从文件中读取内容到后方的变量中

参数
stream 为指向要读的文件的文件指针
format 为需要用户指定的格式,比如%d,%s等
paramterList 为要存放数据的变量,可以有1个或多个

返回值
返回成功读取的数据的量
如果在读取的中途出错或遇到文件尾,会设置 ferror 或 feof 指示器
如果一个数据都没有读取成功,返回EOF

举例:读取文件中的数据到变量中

#include <stdio.h>
#include <assert.h>
int main()
{FILE* pf = fopen("test.txt", "w");if (pf == NULL)assert(pf);char str[20] = " ";fscanf(pf, "%s", str);fclose(pf);pf = NULL;return 0;
}

6.8 fprintf

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

功能
根据给出的格式,将对应变量中的值写入文件中

参数
stream 为指向要写的文件的指针
format 为需要用户指定的格式,比如%d,%s等
paramterList 为要读取的变量,可以有1个或多个

返回值
操作成功,则返回成功写入的字符的数量
操作失败,返回负数

举例:写入数据到文件中

#include <stdio.h>
#include <assert.h>
int main()
{FILE* pf = fopen("test.txt", "w");if (pf == NULL)assert(pf);char str[20] = "hello world";printf("%d", fprintf(pf, "%s", str));fclose(pf);pf = NULL;return 0;
}

6.9 fread

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

功能
从文件中读取 count 个 size 大小的数据到 ptr 指向的空间内,但是是以二进制的形式进行读取

参数
ptr 为指向最终存放数据的空间的指针
size 是读取的每个元素的大小,单位为字节
count 是读取的元素个数
stream 是指向要读取的文件的文件指针

返回值
返回成功读取的元素的个数

举例:从文件中读取5个4字节的数据至数组中

#include <stdio.h>
#include <assert.h>
int main()
{FILE* pf = fopen("test.txt", "rb");if (pf == NULL)assert(pf);int arr[5] = { 0 };fread(arr, sizeof(int), 5, pf);fclose(pf);pf = NULL;return 0;
}

6.10 fwrite

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

功能
从 ptr 指向的空间内读取 count 个 size 大小的数据并以二进制的形式写到文件内,

参数
ptr 为指向要读取的空间的指针
size 每个元素的大小
count 为元素的个数
stream 为指向要写入数据的文件的指针

返回值
返回成功写入的元素的个数

举例:向文件中写入5个4字节的数据

#include <stdio.h>
#include <assert.h>
int main()
{FILE* pf = fopen("test.txt", "wb");if (pf == NULL)assert(pf);int arr[5] = { 1,2,3,4,5 };fwrite(arr, sizeof(int), 5, pf);fclose(pf);pf = NULL;return 0;
}

6.11 fseek

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

功能
通过文件指针的位置,偏移量来移动文件指针

参数
stream 是指向文件的文件指针
offset 是偏移量,用来计算新的文件指针位置
origin 是文件指针的位置,有以下三个取值

取值含义
SEEK_SET文件的起始位置
SEEK_CUR当前文件指针的位置
SEEK_END文件的末尾

返回值
操作成功,返回0
操作失败,返回非0

举例:读取下面这个文件的d字符
在这里插入图片描述

#include <stdio.h>
#include <assert.h>
int main()
{FILE* pf = fopen("test.txt", "r");if (pf == NULL)assert(pf);fseek(pf, 3, SEEK_CUR);printf("%c", fgetc(pf));fclose(pf);pf = NULL;return 0;
}

图解:
在这里插入图片描述
注意事项
若 origin 取值为 SEEK_END ,则偏移量需要给入负数,才能读取前面的值

6.12 ftell

long int ftell ( FILE * stream );

功能
返回当前文件指针相对于起始位置的偏移量

参数
stream 为指向文件的文件指针

返回值
成功返回当前文件指针的位置
错误返回 -1L

举例:计算下面文件的文件尾相对于起始位置的偏移量
在这里插入图片描述

#include <stdio.h>
#include <assert.h>
int main()
{FILE* pf = fopen("test.txt", "r");if (pf == NULL)assert(pf);while (fgetc(pf) != EOF); //使文件指针遍历到结尾printf("%d", ftell(pf));fclose(pf);pf = NULL;return 0;
}

图解:
在这里插入图片描述

6.13 rewind

void rewind ( FILE * stream );

功能
将文件指针重置到文件的开始位置

参数
stream 为指向文件的文件指针

返回值

举例:输出两次下列文件的内容
在这里插入图片描述

#include <stdio.h>
#include <assert.h>
int main()
{FILE* pf = fopen("test.txt", "r");if (pf == NULL)assert(pf);char ch = 0;while ((ch = fgetc(pf)) != EOF){printf("%c ", ch);}printf("\n", ch);rewind(pf); //重置文件指针的位置while ((ch = fgetc(pf)) != EOF){printf("%c ", ch);}fclose(pf);pf = NULL;return 0;
}

6.14 feof 和 ferror

int feof ( FILE * stream );

功能
判断文件的读取是否因为遇到了文件尾而结束

参数
stream 为指向文件的文件指针

返回值
是遇到了文件尾而结束,则返回非0
不是则返回0

int ferror ( FILE * stream );

功能
判断文件的读取是否因为遇到了错误而结束

参数
stream 为指向文件的文件指针

返回值
是遇到了错误而结束则返回非0
不是则返回0

我们可以通过使用 feof 和 ferror 来让文件的读取更加安全

#include <stdio.h>
#include <assert.h>
int main()
{FILE* pf = fopen("test.txt", "r");if (pf == NULL)assert(pf);char ch = 0;while ((ch = fgetc(pf)) != EOF){printf("%c ", ch);}if (feof(pf)){printf("遇到文件尾结束");}else if (ferror(pf)){perror("fault");}fclose(pf);pf = NULL;return 0;
}

7 文件缓冲区

计算机在从文件内读取数据或向文件内写入数据时,会先将数据存入输入/输出缓冲区,待输入/输出缓冲区被填满时,才会将数据读入计算机或输入到文件内,如果没有缓冲区的话,那么就会出现输入/输出一次数据,操作系统就要介入进行处理的情况,操作系统不断被打断,无法服务于其它的进程,会使得操作系统的效率降低
在这里插入图片描述

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

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

相关文章

C++语法与面向对象特性(2)

一.inline函数1.inline的基本特性被inline修饰的函数被称为内联函数。inline函数设计的初衷是为了优化宏的功能&#xff0c;编译器会在编译阶段对inline函数进行展开。然而需要注意的是&#xff0c;inline对于编译器而言是一种建议&#xff0c;它通常会展开一些简短的&#xff…

Linux中grep命令

Linux 中的 grep 用法详解grep 是 Linux 中强大的文本搜索工具&#xff0c;用于在文件或输入流中查找匹配指定模式的行。其基本语法为&#xff1a;grep [选项] "模式" [文件]核心功能基础搜索在文件中查找包含特定字符串的行&#xff1a;grep "error" log.…

【遥感图像入门】遥感中的“景”是什么意思?

在遥感成像中,“3景城市影像”和“5景城市影像”中的“景”是遥感数据的基本单位,通常指一次成像过程中获取的独立遥感影像块。这一概念的具体含义需结合技术背景和应用场景理解: 一、“景”的技术定义 单次成像的独立覆盖区域 遥感平台(如卫星、飞机)在特定时间和位置对…

Pytorch-07 如何快速把已经有的视觉模型权重扒拉过来为己所用

下载&#xff0c;保存&#xff0c;加载&#xff0c;使用模型权重 在这一节里面我们会过一遍对模型权重的常用操作&#xff0c;比如&#xff1a; 如何下载常用模型的预训练权重如何下载常用模型的无训练权重&#xff08;只下载网络结构&#xff09;如何加载模型权重如何保存权…

C语言零基础第9讲:指针基础

目录 1.内存和地址 2.指针变量和地址 2.1 取地址操作符&#xff08;&&#xff09; 2.2 指针变量 2.3 解引用操作符&#xff08;*&#xff09; 2.4 指针变量的大小 3.指针变量类型的意义 3.1 指针的解引用 3.2 指针 - 整数 3.3 void*指针 4.指针运算 4.1 指针…

013 HTTP篇

3.1 HTTP常见面试题 1、HTTP基本概念&#xff1a; 超文本传输协议&#xff1a;在计算机世界里专门在「两点」之间「传输」文字、图片、音频、视频等「超文本」数据的「约定和规范」HTTP常见的状态码 [[Pasted image 20250705140705.png]]HTTP常见字段 Host 字段&#xff1a;客户…

每日面试题20:spring和spring boot的区别

我曾经写过一道面试题&#xff0c;题目是为什么springboot项目可以直接打包给别人运行&#xff1f;其实这涉及到的就是springboot的特点。今天来简单了解一下springboot和spring的区别&#xff0c; Spring 与 Spring Boot&#xff1a;从“全能框架”到“开箱即用”的进化之路 …

ClickHouse数据迁移

ClickHouse实例是阿里云上的云实例&#xff0c;想同步数据到本地&#xff0c;本地部署有ClickHouse实例&#xff0c;下面为单库单表 源实例&#xff1a;阿里云cc-gs5xxxxxxx.public.clickhouse.ads.aliyuncs.com:8123 目标实例&#xff1a;本地172.16.22.10:8123 1、目标实例建…

sqli-labs-master/Less-41~Less-50

Less-41这一关还是用堆叠注入&#xff0c;这关数字型不需要闭合了。用堆叠的话&#xff0c;我们就不爆信息了。我们直接用堆叠&#xff0c;往进去写一条数据?id-1 union select 1,2,3;insert into users (id,username,password) values(666,zk,180)--看一下插进去了没?id-1 u…

Tiger任务管理系统-10

十是个很好美好的数字&#xff0c;十全十美&#xff0c;确实没让人失望&#xff0c;收获还是很大的。 温习了前端知识&#xff0c;巩固了jQuery&#xff0c;thymeleaf等被忽视的框架&#xff0c;意外将之前的所学所用的知识都连起来了&#xff0c;感觉有点像打通了任督二脉一样…

ora-01658 无法为表空间 users中的段创建initial区

ora-01658 无法为表空间 users中的段创建initial区 参考1 参考2 参考3 参考4 给用户新增表空间 alter tablespace system add datafile D:\APP\ADMINISTRATOR\ORADATA\ORCL\SYSTEM03.DBF size 5G autoextend on next 10M;设置表空间文件自动扩展 ALTER DATABASE DATAFILE /…

lodash的替代品es-toolkit详解

一、es-toolkit简介 es-toolkit 是一款先进的高性能 JavaScript 实用程序库,体积小巧,并支持强类型注释,典型特征包括: 提供各种日常实用函数并采用现代实现,例如: debounce、delay、chunk、sum 和 pick 等 设计充分考虑了性能,在现代 JavaScript 环境中实现了 2-3 倍…

【原创】基于gemini-2.5-flash-preview-05-20多模态模型实现短视频的自动化二创

画面和解说保持一致&#xff0c;这个模型就是NB[16:57:37] [*] 正在从视频中提取帧和时长 (频率: 1.0 帧/秒)... [16:57:55] [] 提取完成。视频时长: 83.40秒, 提取了 84 帧。 [16:57:55] [*] 使用AI供应商: gemini [16:57:55] [*] 正在进行视觉分析... [16:57:55] L-> 正…

数仓架构 数据表建模

数仓架构 主要用来描述 数据加工的实时链路 和 离线链路之间的关系,即 流批 关系; lamda 架构, 是两条路, 实时计算式的, 维护数据的实时性。然后每天经过批计算后, 覆盖实时的计算结果。 保证数据准确性。 kappa架构, 即流批一体了 数据建模 星型模型是数据仓库中最…

vscode调试python脚本时无法进入函数内部的解决方法

只需在launch.json配置文件中添加“justMyCode”:false.

Python day37

浙大疏锦行 python day37. 内容&#xff1a; 保存模型只需要保存模型的参数即可&#xff0c;使用的时候直接构建模型再导入参数即可 # 保存模型参数 torch.save(model.state_dict(), "model_weights.pth")# 加载参数&#xff08;需先定义模型结构&#xff09; mod…

ORACLE进阶操作

1 事务 事务的任务便是使数据库从一种状态变换成为另一种状态&#xff0c;这不同于文件系统&#xff0c;它是数据库所特用的。 所有的数据库中&#xff0c;事务只针对DML&#xff08;增删改)&#xff0c;不针对select select只能查看其他事务提交或回滚的数据&#xff0c;不能查…

Modbus 的一些理解

疑问&#xff1a;&#xff08;使用的是Modbustcp&#xff09;我在 Modbus slave 上面设置了slave地址为1&#xff0c;位置为40001的位置的值为1&#xff0c;40001这个位置上面的值是怎么存储的&#xff0c;存储在哪里的&#xff1f;他们是怎么进行交互的&#xff1f;在Modbus协…

【运动控制框架】WPF运动控制框架源码,可用于激光切割机,雕刻机,分板机,点胶机,插件机等设备,开箱即用

WPF运动控制框架源码&#xff0c;可用于激光切割机&#xff0c;雕刻机&#xff0c;分板机&#xff0c;点胶机&#xff0c;插件机等设备&#xff0c;考虑到各运动控制硬件不同&#xff0c;视觉应用功能&#xff08;应用视觉软件&#xff09;也不同&#xff0c;所以只开发各路径编…

RabbitMQ-日常运维命令

作者介绍&#xff1a;简历上没有一个精通的运维工程师。请点击上方的蓝色《运维小路》关注我&#xff0c;下面的思维导图也是预计更新的内容和当前进度(不定时更新)。中间件&#xff0c;我给它的定义就是为了实现某系业务功能依赖的软件&#xff0c;包括如下部分:Web服务器代理…