文件
- 文件一般存储在外存(硬盘、光盘、U盘等)当中,而非内存中,文件可以分为文本文件以及二进制文件,其中文本文件保存的内容是字符串,而二进制文件保存的内容是二进制数据,每个文件末尾都有一个结束符,称之为EOF。
- 文件是通过操作系统进行管理的,每个文件都有一个独一无二的名字,文件的完整路径可分为绝对路径和相对路径。绝对路径是指从盘符开始一直到文件所在位置的目录的集合,而相对路径则以当前工作目录为基准,找到一个对应文件,想要用代码操作文件,需要先知道文件的路径。
缓冲区
缓冲区就是一个内存区域,由于CPU读取内存的速度较快,而读取外存速度较慢,为了提高效率,就应尽量减少访问外存的次数,由此设立了缓冲区。在读取数据时,先将外存中的数据拷贝至内存(缓冲区),然后程序再由缓冲区进行数据读取,反之,将数据放入缓冲区,然后再写入外存。缓冲区在文件操作的过程中起到了至关重要的作用。
文件的打开和关闭(fopen、fclose)
文件在读写之前应该先打开文件,在使用结束之后应该关闭文件,在打开文件的同时,会返回一个FILE* 的指针变量指向该文件,也相当于建立了指针和文件的关系。fopen函数和fclose函数在打开或关闭文件失败时,都会返回一个空指针NULL。
1 | FIlE* fopen(const char* filename, const char* mode); |
对于fopen函数,它的第一个参数是文件名,在传参时应输入文件的绝对路径或相对路径,第二个参数是文件的使用方式,具体如下。
文件使用方式 | 含义 | 如果指定文件不存在 |
---|---|---|
“r”(只读) | 为了输入数据,打开一个已经存在的文本文件 | 出错 |
“w”(只写) | 为了输出数据,打开一个文本文件 | 建立一个新的文件 |
“a”(追加) | 向文本文件尾添加数据 | 出错 |
“rb”(只读) | 为了输入数据,打开一个二进制文件 | 出错 |
“wb”(只写) | 为了输出数据,打开一个二进制文件 | 建立一个新的文件 |
“ab”(追加) | 向一个二进制文件尾添加数据 | 出错 |
“r+”(读写) | 为了读和写,打开一个文本文件 | 出错 |
“w+”(读写) | 为了读和写,建议一个新的文件 | 建立一个新的文件 |
“a+”(读写) | 打开一个文件,在文件尾进行读写 | 建立一个新的文件 |
“rb+”(读写) | 为了读和写打开一个二进制文件 | 出错 |
“wb+”(读写) | 为了读和写,新建一个新的二进制文件 | 建立一个新的文件 |
“ab+”(读写) | 打开一个二进制文件,在文件尾进行读和写 | 建立一个新的文件 |
需要注意的是,在使用fopen和fclose函数是,需要对返回值进行判空,以避免文件打开失败却又继续运行程序的情况。
字符输入/输出函数(fgetc/fputc)
使用fgetc来读取一个字符,使用fputc来输出一个字符
1 | int fgetc( FILE* stream ); |
文本行输入/输出函数(fgets/fputs)
使用fgets读取一行内容,使用fputs写入一行内容
1 | char* fgets( char* string, int n, FILE* stream ); |
格式化输入/输出函数(fscanf/fprintf)
格式化的读写方式,用法类似scanf和printf
1 | int fscanf( FILE *stream, const char *format [, argument ]... ); |
二进制输入/输出函数(fread/fwrite)
使用fread读取n个字节,使用fwrite写入n个字节
1 | size_t fread( void *buffer, size_t size, size_t count, FILE *stream ); |
小结
在文件的操作这一方面,各种编程语言的操作方式都大同小异,需要先打开文件,进行读写,最后关闭文件,需要注意的就是在打开文件后记得要关闭,否则可能会导致文件出错。