在程序设计中,一般把文件分为两种,一种是程序文件,另一种是数据文件。在本章中我们讨论的是数据文件。
1、文件的打开和关闭
1.1、文件指针
在使用文件时,每个被使用的文件都会在内存中开辟一块空间,里面存放着文件名,文件的位置等信息,这些信息是保存在一个结构体中,这个结构体名字叫FILE。我们不需要知道结构体内部有什么东西,我们只要知道怎么使用它。
一般情况下,我们都是创建一个指针变量FEILE。
FILE* = pf;
1.2、fopen和fclose
在使用文件前,我们需要用fopen打开文件。
FILE * fopen ( const char * filename, const char * mode )
filename:该参数为想打开文件的字符串
mode :该参数为文件的打开方式,必须是字符串
- "r":输入数据,打开指定文件,该文件必须存在
- "w":输出数据,打开指定文件,文件存在时丢弃文件内容视为新文件;如果不存在,创建新文件
- "a":输出数据,打开指定文件,向文件尾部追加数据,如果文件不存在创建新文件
- "r+":输入\输出数据,打开指定文件,该文件必须存在,输出数据时从头覆盖
- "w+":输入\输出数据,打开指定文件,文件存在时丢弃文件内容视为新文件;如果不存在,创建新文件
- "a+":输入\输出数据,打开指定文件,向文件尾部追加数据,如果文件不存在创建新文件
- "r\w\a b +":以二进制的形式完成上面的操作
用fclose关闭文件
int fclose ( FILE * stream );
stream:想要关闭的文件
在文件正常关闭时返回零,如果失败,返回EOF
FILE* pf;\\创建文件指针
pf = fopen("text.txt", "w");\\以只写方式打开文件
\\对文件操作
{
···;
}
fclose(pf);\\关闭文件
pf = NULL;\\避免野指针
2、文件顺序读写
以下是一些可以读\写文件的函数
函数名 | 功能 | 适用于 |
fgetc | 字符输入 | 所有输入流 |
fputc | 字符输出 | 所有输出流 |
fgets | 字符串输入 | 所有输入流 |
fputs | 字符串输出 | 所有输出流 |
fscanf | 格式化输入 | 所有输入流 |
fprintf | 格式化输出 | 所有输出流 |
fread | 二进制输入 | 文件 |
fwrite | 二进制输出 | 文件 |
上面的一些函数大多数都见过相似的,scanf,printf等,但这些函数只能通过stdin输入和stdout输出,而fprintf和fscanf可以用任意输出流/输入流。
C语言默认开启的三个输出流
- stdin--标准输入流--键盘
- stdout--标准输出流--屏幕
- stderr--标准错误流--屏幕
3.文件随机读写
现在有一个文件,里面内容是“abcdefg”,得到指向d的指针可以用fgetc一个一个挪,但也可以使用fseek函数。
3.1、fseek
int fseek ( FILE * stream, long int offset, int origin );
stream:文件指针
offset: 相对于origin的偏移量,向前偏移为正数,向后偏移为负数,单位为字节
origin:一般为三个常量
SEEK_SET | 文件的开头 |
SEEK_CUR | 文件指针的当前位置 |
SEEK_END | 文件的末尾 |
3.2、ftell
long int ftell ( FILE * stream );
这个函数的作用是,返回文件指针相对于起始地址的偏移量
3.3、rewind
void rewind ( FILE * stream );
这个函数的作用是,将文件指针指向文件起始位置