171-C语言中的文件

C语言中的文件是什么?

所谓文件(file)一般指存储在外部介质上数据的集合,比如我们经常使用的txt,bmp,jpg,exe,rmvb等等。这些文件各有各的用途,我们通常将它们放在磁盘或者可移动盘等介质中。

文件无非就是一段数据的集合,这些数据可以是有规则的集合,也可以是无序的集合。操作系统也就是以文件为单位对数据进行管理的。也就是说,要访问外部介质上的数据,必须先按照文件名进行查找,然后从该文件中读取数据。要想写数据到外部介质,必须得建立一个文件,然后再写入。因此,你眼前的文件只是数据的集合。

文件一般包括三要素:文件路径、文件名、后缀。
由于在C语言中’ \ ‘一般是转义字符的起始标志,故在路径中需要用2个’ \ ‘表示路径中目录层次的间隔,也可以使用’ / '作为路径中的分隔符。
例如 "D:\ \ tulun\ \test.c"或者 “D:/tulun/test.c” 表示文件test.c保存在D盘tulun目录下。
"tu.txt"表示当前目录下的文件tu.txt

文件路径:可以显示指出其绝对路径,如上面的"D:\ “或者”D:/”
如果没有显示指出其路径,默认为当前路径。也就是相对路径

数据的输入和输出几乎伴随着每个C语言程序,所谓输入就是从“源端”获取数据,所谓输出可以理解为向“终端“写入数据。这里的源端可以是键盘,鼠标,硬盘,光盘,扫描仪等输入设备,终端可以是显示器,硬盘,打印机等输出设备。在C语言中,把这些输入和输出设备也看作”文件“。

C语言文件系统中的类型
FILE:对象类型,足以保有控制C I/O流所需的全部信息
fpost_t:非数组完整对象类型,足以唯一指定文件的位置和多字节剖析状态

每个FILE对象直接或间接保有下列信息:
在这里插入图片描述
预定义标准流
在这里插入图片描述
宏常量
在这里插入图片描述
在这里插入图片描述
流的概念及分类
在这里插入图片描述

文本文件和二进制文件有什么区别?

文本文件:把要存储的数据当成一系列字符组成,把每个字符的ASCII码值存入文件中。每个ASCII值占一个字节,每个字节表示一个字符。故文本文件也称作字符文件或ASCII文件,是字符序列文件。
二进制文件:把数据对应的二进制形式存储到文件中, 是字节序列文件。
在这里插入图片描述

语言与文件读写

文件库函数stdio.h链接库:
http://www.cplusplus.com/reference/cstdio/

C语言操作文件分为三步
1、打开文件
2、读写文件
3、关闭文件

打开文件函数原型
FILE* fopen(const char *filename,const char * mode);

函数参数:
filename:文件名,包括路径,如果不显示含有路径,则表示当前路径。
例如:"D:\ \text.txt"表示D盘根目录下的文件text.txt文件。“tulun.txt"表示当前目录下的文件tulun.txt。
mode:文件打开模式,指出对该文件可进行的操作。常见的打开模式如“r”,表示只读,"w"表示只写。 "rw"表示读写,"a"表示追加写入。

图示:
在这里插入图片描述
返回值:
打开成功,返回该文件对应的FILE类型的指针;打开失败,返回NULL;故需定义FILE类型的指针变量,保存该函数的返回值。可根据该函数的返回值判断文件打开是否成功。

关闭函数fclose的原型:
int fclose(FILE* stream);
函数参数
stream:指向要关闭流对象的指针。
返回值:
如果流被成功关闭,返回0值。失败是,返回EOF(-1)。
即使调用失败,作为参数传递的流将不再与文件或其缓冲区关联。

字符串格式化函数原型
int sprintf(char *str,const char * format,…);
函数参数
str:指向缓冲区指针,缓冲区足够大
format:格式化字符串,该字符串遵循与printf中的格式相同的规范。
…:附加参数(可变 根据格式化字符串的不同,函数可能需要一系列附加参数,每个参数都包含一个值,用于替换格式字符串中的格式说明符。

返回值
如果成功,将返回写入的字符总数。此计数不包括自动附加在字符串末尾的额外空字符。失败返回负数。

在这里插入图片描述
注意:Windows OS上的C流在输出时将’\n’转换为’\r\n’,输入时将’\r\n’转换为’\n’。

格式化写入函数
int fprintf(FILE* stream,const char* format,…);

输出函数:
int printf(const char * format,…);
在这里插入图片描述
从流中读取格式化数据函数
int fscanf(FILE* stream,const char * format,…);
函数参数
stream:指向文件对象的指针,该对象标识要从中读取数据的输入流
format:格式化字符串,该字符串遵循与scanf中的格式相同的规范
返回值
成功赋值的接收参数的数量(可以为0,在首个接收用参数赋值前匹配失败的情况下),或者若输入在首个接收用参数赋值前发生失败,则为EOF。
在这里插入图片描述

二进制文件的读写

块数据写入函数:
size_t fwrite(const void *ptr,size_t size,size_t count,FILE *stream);
函数参数:
ptr: 这是指向要被写入的元素数组的指针
size: 这是要被写入的每个元素的大小,以字节为单位
count:这是元素的个数,每个元素的大小为size字节
stream:这是指向FILE对象的指针,该FILE对象指定了一个输出流
返回值:
返回成功写入元素的个数,若出现错误或到达文件末尾,则可能小于count
如果返回的数值与count参数值不同,则写入错误将阻止函数完成。在这种情况下,将为流设置错误指示器(ferror);

块数据读出函数:
size_t fread(void *ptr,size_t size,size_t count,FILE *stream);
函数参数
ptr: 指向大小至少为(size *count)字节的内存块的指针,从流中读出的数据存储到ptr指向的内存。
size:读取元素的大小,unsigned int
count:读取元素的个数
stream:是指向FIEL对象的指针,该FILE对象指定了一个输入流
返回值
返回成功读取的对象个数,若出现错误或到达文件末尾,则可能小于count
若size或count为0,则fread返回0且不进行其他动作。
fread不区分文件尾和错误,因此调用者必须用feof和ferror才能判断发生了什么。
在这里插入图片描述
在这里插入图片描述

缓冲和非缓冲系统
在这里插入图片描述

写数据

在这里插入图片描述

读数据

在这里插入图片描述

int fflush(FILE *stream)

在这里插入图片描述

void setbuf(FIEL *stream,char *buff);

在这里插入图片描述
一个常见的错误是设置stdin或stdout的缓冲区为生存期在程序终止前结束的数组:
在这里插入图片描述
在这里插入图片描述

int setvbuf(FILE*stream,char *buffer,int mode,size_t size);
在这里插入图片描述
期待默认缓冲区大小BUFSIZ为实现上文件I/O的最高效缓冲区大小,但POSIX fstat经常提供更好的估计。

文件位置

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
错误处理
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
int ferror(FILE *stream);
检查给定文件流的错误。
参数
stream要检查的文件流
返回值
若文件流已出现错误则为非0值,否则为0

在这里插入图片描述
文件操作
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
无格式输入/输出
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

C11标准

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

猜你喜欢

转载自blog.csdn.net/LINZEYU666/article/details/113660370