当前位置: 首页 > news >正文

文件操作函数

本文是小编巩固自身而作,如有错误,欢迎指出!

1.使用文件的原因

我们编写的程序都是有生命周期的,储存在电脑的内存中,如果程序退出,内存回收,数据就会丢失,等程序再次运行,是看不到之前的数据的,如果想要将其保存起来,我们就需要用到文件。

2.什么是文件

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

2.1程序文件

程序文件其实就是我们平时了解的

源程序文件(.c)

目标文件(.obj)

可执行程序(.exe)

2.2数据文件

⽂件的内容不⼀定是程序,⽽是程序运⾏时读写的数据,⽐如程序运⾏需要从中读取数据的⽂件,或 者输出内容的⽂件。

本章讨论的是数据⽂件。 在以前各章所处理数据的输⼊输出都是以终端为对象的,即从终端的键盘输⼊数据,运⾏结果显⽰到 显⽰器上。3

其实有时候我们会把信息输出到磁盘上,当需要的时候再从磁盘上把数据读取到内存中使⽤,这⾥处 理的就是磁盘上⽂件。

3.二进制文件和文本文件

根据数据的组织形式,数据⽂件被称为⽂本⽂件和⼆进制⽂件。

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

⼀个数据在⽂件中是怎么存储的呢?

字符⼀律以ASCII形式存储,数值型数据既可以⽤ASCII形式存储,也可以使⽤⼆进制形式存储。 

看看如下代码

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{int a = 10000;FILE* pf = fopen("testblog.txt", "wb");//以二进制写文件fwrite(&a, 4, 1, pf); fclose(pf);pf = NULL;return 0;
}

下面是打开二进制文件的方法 

打开后我们可以看到 

 4.文件的打开与关闭

4.1流与标准流

流是一个很抽象的概念,简单的白话来说就是数据的输入与输出都要通过流,直接解释很难理解,我们可以通过一些标准流辅助理解

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

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

 • stdin标准输⼊流,在⼤多数的环境中从键盘输⼊,scanf函数就是从标准输⼊流中读取数据。

• stdout标准输出流,⼤多数的环境中输出⾄显⽰器界⾯,printf函数就是将信息输出到标准输出 流中。

• stderr标准错误流,⼤多数环境中输出到显⽰器界⾯。 

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

4.2文件打开关闭函数

⽂件在读写之前应该先打开⽂件,在使⽤结束之后应该关闭⽂件。

在编写程序的时候,在打开⽂件的同时,都会返回⼀个FILE*的指针变量指向该⽂件,也相当于建⽴了 指针和⽂件的关系。

ANSIC规定使⽤ fopen 函数来打开⽂件, fclose 来关闭⽂件。

下面是函数原型

//打开⽂件 
FILE * fopen ( const char * filename, const char * mode );
//关闭⽂件 
int fclose ( FILE * stream );//成功返回0,失败返回EOF

下面是文件的打开模式 

5.文件的读写

5.1顺序读写函数介绍

5.1.1fgetc,fputc

fgetc 函数从给定的文件流 stream 中读取一个字符,并将文件位置指示器向前移动一个字节(如果文件流支持定位操作)。 

fputc 是 C 语言标准库中的一个函数,用于将一个字符写入到指定的文件流中。

函数原型

int fgetc(FILE *stream);
int fputc(int character, FILE *stream);

 下面是示例

#include <stdio.h>int main() {FILE* file = fopen("example.txt", "w+");if (file == NULL) {perror("无法打开文件");return 1;}char ch = 'A';fputc(ch, file);// 将文件指针移动到文件开头rewind(file);char ans;ans = fgetc(file);// 使用 %c 格式化字符输出printf("%c\n", ans);fclose(file);return 0;
}

5.1.2fgets,fputs 

fgets 是 C 语言标准库中的一个函数,用于从指定的文件流中读取一行数据。

fputs 是 C 语言标准库中的一个函数,用于将一个字符串写入到指定的文件流中。

函数原型

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

 

#include <stdio.h>int main() {FILE* file = fopen("example.txt", "w");if (file == NULL) {perror("无法打开文件");return 1;}const char* message = "这是要写入文件的内.";if (fputs(message, file) == EOF) {perror("写入文件失败");fclose(file);return 1;}fclose(file); // 先关闭文件,以确保写入操作完成并刷新缓冲区file = fopen("example.txt", "r"); // 重新以读模式打开文件if (file == NULL) {perror("无法打开文件");return 1;}char ans[100];if (fgets(ans, 20, file) != NULL) {for (int i = 0; ans[i] != '\0'; i++) { // 正确的循环条件,确保只输出实际读取到的字符printf("%c", ans[i]);}}else {perror("读取文件失败");}fclose(file);return 0;
}

5.1.3fprintf,fscanf

fscanf 和 fprintf 是 C 语言中用于格式化输入输出的函数,它们操作的对象是文件流。

函数原型

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

 

#include <stdio.h>int main(){// 以读写模式打开文件FILE *file = fopen("data.txt", "w+");if (file == NULL) {perror("无法打开文件");return 1;}// 使用 fprintf 写入数据int num = 42;float fnum = 3.14f;const char *str = "Hello, World!";int writtenChars = fprintf(file, "%d %f %s", num, fnum, str);if (writtenChars < 0) 
{perror("写入文件失败");fclose(file);return 1;}// 将文件指针重置到文件开头,以便读取rewind(file);// 使用 fscanf 读取数据int readNum;float readFnum;char readStr[100];int readItems = fscanf(file, "%d %f %s", &readNum, &readFnum, readStr);if (readItems == EOF){perror("读取文件失败");fclose(file);return 1;}// 输出读取的数据printf("读取的整数: %d\n", readNum);printf("读取的浮点数: %f\n", readFnum);printf("读取的字符串: %s\n", readStr);fclose(file);return 0;
}

6.文件的随机读写

6.1fseek

根据⽂件指针的位置和偏移量来定位⽂件指针(⽂件内容的光标)。

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

 

#include <stdio.h>
int main ()
{FILE * pFile;pFile = fopen ( "example.txt" , "wb" );fputs ( "This is an apple." , pFile );fseek ( pFile , 9 , SEEK_SET );//SEEK_SET是起始位置fputs ( " sam" , pFile );fclose ( pFile );return 0;
}

6.2 ftell

返回⽂件指针相对于起始位置的偏移量

long int ftell ( FILE * stream );
#include <stdio.h>
int main()
{FILE* pFile;long size;pFile = fopen("myfile.txt", "wb+");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;
}

 6.3rewind

在先前的代码中已经使用过了,其作用是让⽂件指针的位置回到⽂件的起始位置,不再演示

7.文件结束的判定

7.1feof

feof 是 C 语言标准库中的一个函数,用于检测文件指针是否已到达文件末尾。

牢记:在⽂件读取过程中,不能⽤ feof 函数的返回值直接来判断⽂件的是否结束。 feof 的作⽤是:当⽂件读取结束的时候,判断读取结束的原因是否是:遇到⽂件尾结束。

如果文件指针已经到达文件末尾,或者在读取操作中遇到了文件末尾的条件,feof 函数将返回一个非零值(表示真);否则,返回 0(表示假)。

函数原型

int feof(FILE *stream);
#include <stdio.h>int main() {FILE *file = fopen("example.txt", "r");if (file == NULL) {perror("无法打开文件");return 1;}int ch;while (!feof(file)) {ch = fgetc(file);if (ch != EOF) {putchar(ch);}}if (feof(file)) {printf("\n已到达文件末尾\n");} else {printf("\n读取文件时发生错误\n");}fclose(file);return 0;
}

今天的分享就到这里,后续会继续更新,感谢阅读!

相关文章:

  • 基于cubeMX的hal库STM32实现硬件IIC通信控制OLED屏
  • 汽车VIN码识别:解锁汽车行业的智能密码
  • Spark-SQL 项目
  • 爬虫(requests库,logging库)
  • react 父子组件通信 子 直接到父, 父 forwardref子
  • window上 elasticsearch v9.0 与 jmeter5.6.3版本 冲突,造成es 启动失败
  • 关于在Springboot中设置时间格式问题
  • Git -> Git 所有提交阶段的回滚操作
  • 测试-时间规模化定律可以改进世界基础模型吗?
  • [Java · 铢积寸累] 数据结构 — 二维数组 - 概念引入
  • 【YOLOv8-pose部署至RK3588】模型训练→转换RKNN→开发板部署
  • docker保存镜像到本地
  • AutoJs相关学习
  • Spring Boot中`logging.config`配置项的详解及使用说明
  • Vscode指定缓存路径 .vscode 路径
  • 嘻游组件解密工具实战教程:资源解包与UI替换全流程
  • Java从入门到“放弃”(精通)之旅——抽象类和接口⑨
  • Linux新手快速入门指南
  • XML内容解析成实体类
  • 【Python笔记 03 】运算符
  • 民政部党组成员、中国老龄协会会长刘振国任民政部副部长
  • 外交部回应菲律宾涉仁爱礁言论:菲方7轮运补均提前通报中方
  • 波音CEO称中方因中美“贸易战”停止接收波音飞机,外交部回应
  • 研讨会丨明清区域史研究的比较与对话
  • 新《火灾统计管理规定》即将施行,火灾死亡统计时限延长
  • 王鹏任海南文昌市委书记