文件的分类
- 按文件的用户的角度分类:分为磁盘文件和设备文件
- 磁盘文件按存储方式分类:
①按文本形式(ASCII值)存储,每个字符按一个字节存储,比如数字10000,用五个字节来存储,即‘1’ ‘0’ ‘0’ ‘0’‘0’来存储;
以文本文件存储时,当打开文本文件时,是以单个字节来解析,所以,我们肉眼就可以看到10000.
②按二进制形式存储,以数据在内存中的形式原样存储在磁盘,比如一个short类型的10000,二进制形式:0010 0111 0001 0000,在磁盘里按两个字节存储。
打开文本文件时,以单个字节解析,所以看到的就是乱码,即数据的二进制形式。
打开文件时的读写权限
文件的打开方式:
r或rb : 以只读方式打开一个文本文件(不创建文件,若文件不存在则报错)
w或wb :以写方式打开文件(如果文件存在则清空文件,文件不存在则创建一个文件)
a或ab :以追加方式打开文件,在末尾添加内容,若文件不存在则创建文件
r+或rb+ :以可读、可写的方式打开文件(不创建新文件),如果文件存在,就覆盖文件(注意不是清空)
(以r+覆盖模式打开文件,当文件里存在abcdefg七个字符时,写入rrr三个字符时,文件里的前三个字符被覆盖,即写入rrr后,文件数据为rrrdefg);
w+或wb+ :以可读、可写的方式打开文件(如果文件存在则清空文件,文件不存在则创建一个文件)
a+或ab+ :以添加方式打开文件,打开文件并在末尾更改文件,若文件不存在则创建文件
(以a+追加模式打开文件,当文件里存在abcdfeg时,写入rrr三个字符后,文件里的数据为abcdefgrrr).
文件的读写方式
C语言用一个指针来指向一个记录文件相关信息的结构体,在打开文件后,就用这个文件指针来对文件进行读写数据。
FILE *fopen(const char *filename, const char *mode);
功能:打开文件
参数:
filename:需要打开的文件名,根据需要加上路径
mode:打开文件的模式设置
返回值:
成功:文件指针
失败:NULL
typedef struct
{
short level; //缓冲区"满"或者"空"的程度
unsigned flags; //文件状态标志
char fd; //文件描述符
unsigned char hold; //如无缓冲区不读取字符
short bsize; //缓冲区的大小
unsigned char *buffer; //数据缓冲区的位置
unsigned ar; //指针,当前的指向
unsigned istemp; //临时文件,指示器
short token; //用于有效性的检查
}FILE;
C语言中有三个特殊的文件指针由系统默认打开,用户无需定义即可直接使用:
stdin: 标准输入,默认为当前终端(键盘),使用的scanf、getchar函数默认从此终端获得数据。
stdout:标准输出,默认为当前终端(屏幕),使用的printf、puts函数默认输出信息到此终端。
stderr:标准出错,默认为当前终端(屏幕),使用的perror函数默认输出信息到此终端。
- 单个字符读取
int fputc(int c, FILE *stream);
功能:将ch转换为unsigned char后写入stream指定的文件中
参数:
c:需要写入文件的字符
stream:文件指针
返回值:
成功:返回成功写入文件的字符
失败:返回-1
int fgetc(FILE * stream);
功能:从stream指定的文件中读取一个字符
参数:
stream:文件指针
返回值:
成功:返回读取到的字符
失败:-1
- 行读取
char *fgets(char *s, int size, FILE *stream);
功能:将str所指定的字符串写入到stream指定的文件中,字符串结束符 ‘\0’ 不写入文件。行读写更适合用于处理文本文件。
参数:
s:字符串
size: 字符串的大小
stream:文件指针
返回值:
成功:0
失败:-1
(fgets会从键盘读取换行符;gets从键盘读取换行符后,会丢弃换行符,也可理解为不读取换行符,gets函数使用不安全,不会对输入的数据是否溢出做检查;puts函数会对输出的数据自动加上一个换行)
int fputs(const char *s, FILE *stream);
功能:将str所指定的字符串写入到stream指定的文件中,字符串结束符 ‘\0’ 不写入文件。行读写更适合用于处理文本文件。参数:
s:字符串
stream:文件指针
返回值:
成功:0
失败:-1
- 数据块读取
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
功能:以数据块的方式从文件中读取内容
参数:
ptr:存放读取出来数据的内存空间
size: size_t 为 unsigned int类型,此参数指定读取文件内容的块数据大小
nmemb:读取文件的块数,读取文件数据总大小为:size * nmemb
stream:已经打开的文件指针
返回值:
成功:实际成功读取到内容的块数,如果此值比nmemb小,但大于0,说明读到文件的结尾。
失败:0
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);
功能:以数据块的方式给文件写入内容。块读写更适合用于处理二进制文件。
参数:
ptr:准备写入文件数据的地址,要写入文件的缓冲区的首地址。
size: size_t 为 unsigned int类型,此参数指定写入文件内容的块数据大小
nmemb:写入文件的块数,写入文件数据总大小为:size * nmemb
stream:已经打开的文件指针
返回值:
成功:实际成功写入文件数据的块数目,此值和 nmemb 相等
失败:0
- 格式化读取
int fprintf(FILE *stream, const char *format, …);
功能:遇到格式化写入文件时,应该想到这个函数。根据参数format字符串来转换并格式化数据,然后将结果输出到stream指定的文件中,指定出现字符串结束符 ‘\0’ 为止。
参数:
stream:已经打开的文件
format:字符串格式,用法和printf()一样
返回值:
成功:实际写入文件的字符个数
失败:-1
int fscanf(FILE *stream, const char *format, …);
功能:遇到格式化读取文件时,应该想到这个函数。
从stream指定的文件读取字符串,并根据参数format字符串来转换并格式化数据。
参数:
stream:已经打开的文件
format:字符串格式,用法和scanf()一样
返回值:
成功:参数数目,成功转换的值的个数
失败: - 1
移动文件指针
int fseek(FILE *stream, long offset, int whence);
第二个参数offset:偏移量
第三个参数whence:
SEEK_SET(或0),将参考点设置为文件的开头;
SEEK_CUR(或1),将参考点设置为当前的文件位置;
SEEK_END(或2),将参考点设置为文件的末尾。
void rewind(FILE *stream);
将文件指针移到文件开头。