C语言:文件处理

文件处理

一、文件的类型

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

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

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

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

数据文件按照二进制储存


二、文件的打开和关闭

(一)文件指针

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

结束语

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

相关推荐
湫ccc1 小时前
《Python基础》之字符串格式化输出
开发语言·python
mqiqe1 小时前
Python MySQL通过Binlog 获取变更记录 恢复数据
开发语言·python·mysql
AttackingLin2 小时前
2024强网杯--babyheap house of apple2解法
linux·开发语言·python
Ysjt | 深2 小时前
C++多线程编程入门教程(优质版)
java·开发语言·jvm·c++
ephemerals__2 小时前
【c++丨STL】list模拟实现(附源码)
开发语言·c++·list
码农飞飞2 小时前
深入理解Rust的模式匹配
开发语言·后端·rust·模式匹配·解构·结构体和枚举
一个小坑货2 小时前
Rust 的简介
开发语言·后端·rust
湫ccc2 小时前
《Python基础》之基本数据类型
开发语言·python