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

C语言:文件处理

文件处理

  • 一、文件的类型
    • (一)文本文件和二进制文件
    • (二)程序文件和数据文件
      • 数据文件按照二进制储存
  • 二、文件的打开和关闭
    • (一)文件指针
    • (二)文件的打开和关闭
      • 1、fopen
      • 2、fclose
    • (三)文件的打开方式
  • 三、文件读写函数
    • (一)fgetc
    • (二)fputc
    • (三)fgets
    • (四)fputs
    • (五)fscanf
    • (六)fprintf
    • (七)fwrite
    • (八)fread
    • (九)sscanf
    • (十)sprintf
    • (十一)fseek
    • (十二)ftell
    • (十三)rewind
  • 四、文件缓冲区
  • 结束语

一、文件的类型

(一)文本文件和二进制文件

按照文本的组织信息来分,文件可以分成二进制文件和文本文件

(二)程序文件和数据文件

按照文件功能来分,可以分成程序文件和数据文件

数据文件按照二进制储存

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

二、文件的打开和关闭

(一)文件指针

每个被使用的文件都在内存中开辟了一个相应的文件信息区,用来存放文件的相关信息(如文件的名字,文件状态及文件当前的位置等)。这些信息是保存在一个结构体变量中的。该结构体类型是由系统声明的,取名FILE.

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

不同的C编译器的FILE类型包含的内容不完全相同,但是大同小异。
每当打开一个文件的时候,系统会根据文件的情况自动创建一个FILE结构的变量,并填充其中的信息

(二)文件的打开和关闭

1、fopen

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

用来打开文件。打开成功的同时,函数会返回一个文件指针类型,相当于文件和指针之间建立联系。

int main() {FILE* pf = fopen("test.txt", "w");if (pf != NULL) {fputs("man, what can i see", pf);fclose(pf);}return 0;
}

可以观察到我们的字符串已经被写入到了文件之中。
在这里插入图片描述

2、fclose

int fclose ( FILE * stream );

用来关闭文件,如果文件成功关闭,那么就会返回0,如果失败,返回EOF;

(三)文件的打开方式

文件使用方式 					含义 			如果指定文件不存在
“r”(只读) 		为了输入数据,打开一个已经存在的文本文件  		出错
“w”(只写) 		为了输出数据,打开一个文本文件 		        新建文件
“a”(追加) 		向文本文件尾添加数据      					新建文件
“rb”(只读)	    为了输入数据,打开一个二进制文件 				出错
“wb”(只写)	    为了输出数据,打开一个二进制文件 		   	    新建文件
“ab”(追加) 	向一个二进制文件尾添加数据      				新建文件
“r+”(读写)		为了读和写,打开一个文本文件 					出错
“w+”(读写) 	为了读和写,建议一个新的文件      				新建文件
“a+”(读写) 	打开一个文件,在文件尾进行读写      			新建文件
“rb+”(读写) 	为了读和写打开一个二进制文件 					出错
“wb+”(读写)   为了读和写,新建一个新的二进制文件     	        新建文件
“ab+”(读写) 	打开一个二进制文件,在文件尾进行读和写      	新建文件

三、文件读写函数

在这里插入图片描述

(一)fgetc

int fgetc ( FILE * stream );

成功 : 将返回字符读取(提升为 int 值)。
如果位置指示器位于文件末尾,则该函数返回 EOF 并设置流的 EOF 指示符 (feof)。

失败 :
返回类型为 int 以适应特殊值 EOF,该值表示失败。
如果发生其他读取错误,该函数也会返回 EOF,但会设置其错误指示器 (ferror)。

(二)fputc

int fputc ( int character, FILE * stream );

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

(三)fgets

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

成功 : 如果读取到字符该函数返回 str,如果一个都没有读取到,返回空指针。读取字符时遇到文件末尾,设置 eof 指示(feof)
失败 : 则设置错误指示符 (ferror) 并返回空指针

(四)fputs

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

成功 : 将返回一个非负值。
失败 : 该函数返回 EOF 并设置错误指示器 (ferror)。

(五)fscanf

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

成功 : 该函数返回已成功填充的参数列表的项目数。读取字符时遇到文件末尾,设置 eof 指示(feof)
失败 : 该函数返回 EOF 并设置错误指示器 (ferror)。
如果在解释宽字符时发生编码错误,该函数会将 errno 设置为 EILSEQ。

(六)fprintf

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

成功 : 将返回写入的字符总数。
失败 : 则设置错误指示符 (ferror) 并返回负数。
如果在写入宽字符时发生多字节字符编码错误,则将 errno 设置为 EILSEQ 并返回负数。

(七)fwrite

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

成功 : 返回成功写入的元素总数。
失败 : 如果此数字与 count 参数不同,则写入错误会阻止函数完成。在这种情况下,将为流设置错误指示器 (ferror)。

(八)fread

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

成功 : 返回成功读取的元素总数。
失败 : 如果此数字与 count 参数不同,则表示读取时发生读取错误或达到文件末尾。在这两种情况下,都设置了正确的指示器,可以分别使用 ferror 和 feof 进行检查。

(九)sscanf

int sscanf ( const char * s, const char * format, ...);

成功 : 该函数返回已成功填充的参数列表中的项目数。
失败 : 如果在成功解释任何数据之前输入失败,返回 EOF。

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

(十)sprintf

成功 : 将返回写入的字符总数。此计数不包括自动附加在字符串末尾的附加 null 字符。
失败 : 则返回一个负数。

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

(十一)fseek

定位文件指针

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

成功 :该函数返回零。
失败 :返回非零值。
如果发生读写错误,则设置错误指示器 (ferror)。

在这里插入图片描述
orgin可以取值:
在这里插入图片描述

(十二)ftell

求文件指针相对于起始位置的偏移量

long int ftell ( FILE * stream );

成功 : 将返回位置指示器的当前值。
失败 : 返回 -1,并将 errno 设置为系统特定的正值。

(十三)rewind

将文件指针指向文件的首地址,可以fseek来达到相同的作用

void rewind ( FILE * stream );

在这里插入图片描述

四、文件缓冲区

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

在这里插入图片描述

结束语

相信有了这篇文件操作,下次再也不用担心忘记重新学啦。亲爱的小伙伴,不要忘记支持博主哦!
在这里插入图片描述

http://www.lryc.cn/news/417774.html

相关文章:

  • SpringBoot MybatisPlus selectOne的坑
  • Spring源码-ClassPathXmlApplicationContext的refresh()都做了什么?
  • 网站加密和混淆技术简介
  • Kafka + Kraft 集群搭建教程,附详细配置及自动化安装脚本
  • “Apple Intelligence”的“系统提示词”被曝光了
  • django学习-数据表操作
  • 机器学习-决策树
  • opencascade TopoDS_Shape源码学习【重中之重】
  • Self-study Python Fish-C Note15 P52to53
  • Java小白入门到实战应用教程-异常处理
  • 使用Anaconda安装多个版本的Python并与Pycharm进行对接
  • android系统中data下的xml乱码无法查看问题剖析及解决方法
  • ​MySQL——索引(三)创建索引(2)使用 CREATE INDEX 语句在已经存在的表上创建索引
  • html+css 实现hover选择按钮
  • Python数据可视化利器:Matplotlib详解
  • 2024 NVIDIA开发者社区夏令营环境配置指南(Win Mac)
  • 介绍rabbitMQ
  • AI在医学领域:使用眼底图像和基线屈光数据来定量预测近视
  • VB.NET中如何利用WPF(Windows Presentation Foundation)进行图形界面开发
  • Go语言标准库中的双向链表的基本用法
  • 手机游戏录屏软件哪个好,3款软件搞定游戏录屏
  • 【力扣】4.寻找两个正序数组的中位数
  • 【C++】初识面向对象:类与对象详解
  • 知识图谱学习总结
  • 2021-10-23 51单片机LED1-8按秒递增闪烁
  • 在Linux中宏观的看待线程
  • 提示libfakeroot.so或libfakeroot-sysv.so出错处理方法
  • 【计算机网络】什么是socket编程?以及相关接口详解
  • LeetCode.19.删除链表的倒数第n个节点
  • vue-cesium