C语言:文件处理

embedded/2024/9/25 23:23:04/

文件处理

  • 一、文件的类型
    • (一)文本文件和二进制文件
    • (二)程序文件和数据文件
      • 数据文件按照二进制储存
  • 二、文件的打开和关闭
    • (一)文件指针
    • (二)文件的打开和关闭
      • 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.ppmy.cn/embedded/92656.html

相关文章

SpringBoot高性能清理MySQL历史数据

背景 项目的心跳数据,随着业务的 增长及时间的推移,数据库的数据量越来越庞大,不仅查询性能受到了影响,还消耗过多的数据库空间。为了保证查询的性能,需要控制数据量的大小,与业务商讨,仅保…

QT(2.0)

1.常用控件的介绍 1.1 TextEdit QTextEdit表示多行输入框,也是一个富文本&markdown编辑器,并且能在内容超出编辑框范围时自动提供滚动条。 核心属性 属性 说明 markdown 输入框内持有的内容,支持markdown格式,能够自动的…

深入理解 C++ 中的虚函数和虚表

在 C 中,虚函数和虚表是实现多态性(polymorphism)的核心机制。通过虚函数,C 实现了运行时多态性,允许通过基类指针或引用调用派生类的特定实现。本文将深入探讨虚函数和虚表的概念、工作原理以及它们在实际编程中的应用…

TDD-LTE和FDD-LTE

目录标题 TDD-LTE系统区别OFDM FDD-LTE TDD-LTE系统 TDD-LTE系统通过时分双工技术在同一个频段上进行上行和下行传输。 TDD-LTE:通过时间分割在不同时隙同一频段内进行上下行传输,适用于上下行业务量不对称的场景。 区别OFDM TDD-LTE系统的上下行链路…

LVS集群中的负载均衡技术

目录 一、LVS技术原理 二、NAT模式原理及部署方法 1、工作原理 2、部署方法 1、网络配置 2、软件安装与启用 3、测试 三、DR模式原理及部署方法 1、工作原理 2、部署方法 1、网络配置 2、解决vip响应问题 3、测试 四、ipvsadm命令及参数 1、管理集群服务&#x…

计算机网络TCP/UDP知识点

这是一些在学习过程中关于计算机网络八股文的一些知识点记录: TCP/UDP TCP怎么保证可靠性 1.序列号,确认应答,超时重传 数据到达接收方,接收方需要发出一个确认应答,表示已经收到该数据段,并且确认序号…

C++篇:入门(2)

引用 引用的概念以及定义: 在C中,引用(Reference)是一个非常重要的概念又可以称之为取别名,它允许我们创建一个已存在对象的别名。引用提供了一种机制,通过它可以直接访问另一个变量、对象或函数的值&#…

PCIe学习笔记(18)

Completion完成规则 所有的Read, Non - Posted Write和AtomicOp请求都需要Completion。Completion包括一个Completion头,对于某些类型的完成,后面会跟着一些DW的数据。 •Completion通过ID路由,并使用3 DW头。 ◦请注意,路由ID…