文件
1、文件基本概念
C程序把文件分为ASCII文件和二进制文件,ASCII文件又称文本文件,二进制文件和文本文件(也称ASCII码文件)二进制文件中,数值型数据是以二进制形式存储的,
而在文本文件中,则是将数值型数据的每一位数字作为一个字符以其ASCII码的形式存储,因此,文本文件中的每一位数字都单独占用一个字节的存储空间,
而二进制文件则是把整个数字作为一个二进制数存储的,并非数值的每一位数字都占用单独的存储空间,无论一个C语言文件的内容是什么,
它一律把数据看成是字节构成的序列,即字节流,对文件的存取也是以字节为单位的,输入/输出的的数据流仅受程序控制而不受物理符号(如回车换行符)的控制,所以说C语言文件为流式文件
C语言的文件存取有两种方式:顺序存取和直接存取
(C语言有缓冲型和非缓冲型两种文件系统,缓冲型文件系统是指系统自动自动在内存中为每一个正在使用的文件开辟一个缓冲区,
作为程序与文件之间数据交换的中间媒介,也就是读文件时,数据先送到缓冲区,再传给C语言程序或则外存上,缓冲文件系统利用文件指针标识文件,
而非缓冲文件系统是不会自动设置文件缓冲区,缓冲区必须由程序员自己设定,缓冲型中的文件操作,也称高级文件操作,
高级文件操作函数大多是ANSIC定义的可移植的文件操作函数,具有跨平台和可移植能力,可解决大多数文件操作问题)
2、文件类型指针
可以用该结构体类型来定义文件类型的指针变量
1 FILE *fp;
FILE是在stdio.h中定义的结构体类型,封装了与文件有关的信息,如文件句柄、位置指针及缓冲区等,缓冲文件系统为每个被使用的文件在内存中开辟一个缓冲区,
用来存放文件的有关信息,这些信息被保存在一个FILE结构类型的变量中,fp是一个指向FILE结构体类型的指针变量
3、文件操作常用函数
fopen()函数
函数原型为:FILE *fopen(const char *filename, const char *mode);
fopen(文件路径,文件使用方式);
fopen函数打开filename指定的文件,返回一个指向FILE类型的指针,无论使用哪种方式,当打开文件时出现了错误,fopen函数都将返回NULL
常见的文件使用方式:
"r"----以只读的方式打开文件(该文件必须已经存在,若文件不存在,则会出错)
"w"----以只写的方式打开文件,若文件存在则文件长度清为0,即该文件内容会消失。若文件不存在则建立该文件
"a"----以只写的方式打开文本文件,位置指针移到文件末尾,向文件尾部添加数据,原文件数据保留,若文件不存在则会出错
"+"----与上面的字符串组合,表示以读写的方式打开文本文件,既可向文件中写入数据,也可从文件中读出数据
"b"----与上面的字符串组合,表示打开二进制文件
读写权限和读写方式可以组合使用,但是必须将读写方式放在读写权限的中间或者尾部(换句话说,不能将读写方式放在读写权限的开头)。例如:
- 将读写方式放在读写权限的末尾:"rb"、"wt"、"ab"、"r+b"、"w+t"、"a+t"
- 将读写方式放在读写权限的中间:"rb+"、"wt+"、"ab+"
(因为操作系统对于同时打开的文件数目是有限制的,所以在文件使用结束后必须使用fclose关闭文件,否则会出现意想不到的错误)
(文件路径正斜杠反斜杠相关链接:https://blog.csdn.net/sszgg2006/article/details/8447176)
1 err = fopen_s(&fp, "E:\ww.txt", "w");
或者
1 err = fopen_s(&fp, "E:\ww.txt", "w+");
上述两条语句打开文件后文件内容自动清除,无论是否存在读/写文件操作,都会自动清除
fclose()函数
fclose(文件指针);
若文件关闭成功则返回0,否则返回非0
文件的读写
fread()函数
函数原型:unsigned int fread(void *buffer, unsigned int size, unsigned int count, FILE *fp);
函数功能:从fp所指的文件中读取数据块并存储到buffer所指向的内存中,buffer是待读入数据块存储的起始地址,size是每个数据块的大小(待读入的每个数据块的字节数),
count是最多允许读取的数据块个数(每个数据块size个字节),函数返回的是实际读到的数据块个数
fwrite()函数
函数原型:unsigned int fwrite(const void *buffer, unsigned int size, unsigned int count, FILE *fp);
函数功能:将buffer指向的内存中的数据块写入fp所指的文件,buffer是待输出数据块的起始地址,size是每个数据块的大小(待输出的每个数据块的字节数),
count是最多允许写入的数据块个数(每个数据块size个字节),函数返回的是实际写入的数据块个数
(tips:用户指定的内存块大小,最小为1字节,最大为整个文件)
fread()函数和fwrite()函数是按数据块的长度来处理输入/输出的,在用文本编辑器打开文本文件时可能因发生字符转换而出现莫名其妙的结果,所以这两个函数通常用于二进制文件的输入/输出
fscanf()函数
函数原型:int fscanf (FILE *fp, const char *format, ……);
fscanf(文件指针, 格式字符, 输入列表);
第一个参数为文件指针,第二个参数为格式控制符,第三个参数为地址参数表列,后两个参数与函数scanf()的参数相同
fprintf()函数
函数原型:int fprintf (FILE *fp, onst char *format, ……);
fprintf(文件指针, 格式字符, 输出列表);
第一个参数为文件指针,第二个参数为格式控制参数,第三个参数为输出参数列表,后两个参数和返回值与函数printf()相同
(用函数fscanf()和fprintf()进行文件的格式化读写,读写方便容易理解,但输入时要将ASCII字符转换成二进制数,输出时要将二进制数转换为ASCII字符,耗时较多)
fgets()函数
函数原型:char *fgets(char *s,int n,FILE *fp);
函数功能:该函数从fp所指的文件中读取字符串并在字符串末尾添加‘