12.1 文件的打开与关闭
12.1.1 打开文件
FILE *fopen(char *filename, char *mode);
- filename是一个字符串,表示要打开的文件名。文件名前可加上文件所在路径
mode字符串表示文件的打开方式。 | 打开文件的方式字符 | 含义 | | —- | —- | | r | read。打开一个已存在的文件读取数据,不能写数据。 | | w | write。创建一个新文件写入数据,不能读数据。如果文件已存在,则覆盖该文件。 | | a | append。打开一个存在的文件,在文件尾部追加数据,不能读数据。如果文件不存在,则创建这个文件写入数据。 | | r+ | 打开一个已存在的文件,可读可写。 | | w+ | 创建一个新文件,可读可写。若存在则覆盖。 | | a+ | 等价于a。但可以读取数据。 | | t | text。打开一个文本文件。 | | b | binary。打开一个二进制文件。 |
打开失败则返回NULL
//注意FILE为全部大写
FILE *fp;
fp=fopen("wang.txt", "r");
if(fp==NULL)
{
printf("wang.txt not found");
exit(-1);
}
//打开C盘bak目录下的文件
fp=fopen("C:\\bak\\wang.dat", "wb");
打开文件方式字符串mode可以采用符合形式,操作类型符在前,打开文件类型符在后。如“rb”,“wt”,不可颠倒。但是“+”,除了放在字符串开头,放哪都行。如“w+b”,“wb+”都可以,但“+wb“不行。
12.1.2 关闭文件
int *fclose(FILE *filepointer);
- filepointer:文件指针,通常是fopen的返回值
- 如果正常关闭了文件,返回0,否则返回非0
- 文件打开读取和加工数据后,如果不关闭,可能会丢失数据!
12.1.3 feof函数
int feof(FILE *filepointer);
- 用于判断文件是否结束;
- 读取文件时,若遇到文件尾,则返回1;否则返回0;
-
12.2 文件的读写
12.2.1 字符读写函数fgetc和fputc
int fgetc(FILE *filepointer);
从filepointer指向的文件中读取一个字符(字节)的数据,同时将读写位置指针向前移动1个字节(即指向下一个字符)。
- 读取正常,则返回读取到的字节值;若读取到文件尾或出错,则返回
EOF
(在头文件stdio.h中被定义为-1)。
int fputc(int c, FILE *filepointer);
- 将c表示的字符数据输出到文件指针filepointer所指向的文件中,同时将读写位置指针向前移动1个字节(即指向下一个写入位置)。
- 写入(输出)成功,则返回值就是写入(输出)的字符数据c,否则返回
EOF
。 - int fputchar(char ch)会将ch标准输出流(stdout)中,并显示在屏幕。等价于fputc(c,stdout);
int feof(FILE *filepointer);
- 遇到文件尾,返回1,否则返回0.
- feof同时适用于ASCII码文件和二进制文件
12.2.2 字符串读写函数fgets和fputs
char *fgets(char *s, int n, FILE *filepointer);
- 从指定文件中读取长度最大为n-1个字符的字符串,并在末尾加
'\0'
,然后将字符串存放到s中。同时将读写位置指针向前移动实际读取的字符串长度(≤n-1)个字节 - 从文件中读取到第n-1个字符或遇到
'\n'
后,函数返回。'\n'
也会被读取。 - 操作成功,返回读取的字符串的指针;否则返回
NULL
int fputs(char *s, FILE *filepointer);
- 将s表示的字符串写入文件中,同时将读写位置指针向前移动字符串长度个字节
- fputs函数不会讲字符串结尾符
'\0'
写入文件,也不会自动向文件写入换行符,如果需要写入一行文本,s字符串中必须包含'\n'
-
12.2.3 数据块读写函数fread和fwrite
可用来读写一组数据,如一个数组元素、一个结构变量的值等。
unsigned fread (void *ptr, unsigned size, unsigned n, FILE *filepointer);
从
filepointer
指向的文件中读取n
个数据项,每个数据项的大小是size
个字节,这些数据被存放到ptr
所指向的内存中。同时,将读写位置指针向前移动n*size个字节。- 返回值:操作成功,返回读取的数据项的个数(不是字节的个数);操作错误或遇到文件尾,则返回0。
unsigned fwrite(void *ptr, unsigned size, unsigned n, FILE *filepointer);
- 将
ptr
所指向的内存数据块(n
个大小为size
个字节的数据项)写入到filepointer
指向的文件中。同时,将读写位置指针向前移动n*size个字节。 - 返回值:操作成功,返回实际写入的数据项的个数(不是字节的个数);操作错误,则返回0。
fread和fwrite一般用于二进制文件的输入和输出。
12.2.4 格式化读写函数fscanf和fprintf
int fscanf (FILE *filepointer, const char *format[, address, ...]);
- 从filepointer所指向的文件中读取数据。除了多了一个文件指针外,其他方面与scanf完全相同。
- 操作成功,返回读取的数据项的个数;操作错误或遇到文件尾,返回EOF。
int fprintf (FILE *filepointer, const char *format[, address, ...]);
.
- 将表达式输出到filepointer所指向的文件。除了多了一个文件指针外,其他方面与printf完全相同。
操作成功,返回写入到文件中数据的字节的个数;操作错误,返回EOF。
fscanf(fp, "%d,%f", &i, &t); //若文件中有3, 4.5,则将3送入i, 4.5送入t
fprintf(fp, "%d, %6.2f", i, t); //将i, t按指定格式输出到fp文件
12.3 文件的定位读写
12.3.1 rewind函数 (复位开头)
void rewind(FILE *filepointer);
将filepointer所指向的文件的读写位置指针重新置回到文件首部。
12.3.2 fseek函数 (定点移动)
int fseek(FILE *filepointer, long offset, int whence);
将filepointer所指向的文件的读写位置指针移动到特定位置;
- 距离 whence 的 offset 字节处;
- offset 为正,新的位置在whence 后; offset为负,新的位置在whence 前;
- 操作成功返回0; 否则返回一个非0值。 | whence的常量值 | 数值 | 含义 | | —- | —- | —- | | SEEK_SET | 0 | 文件的开始处 | | SEEK_CUR | 1 | 文件位置指针的当前位置 | | SEEK_END | 2 | 文件的末尾 |
12.3.3 ftell函数 (返回当前)
long ftell(FILE *filepointer);
- 返回 filepointer 所指向的文件的当前读写位置指针的值(用相对文件开头的位移量表示);
- 操作成功,返回当前位置值; 否则返回 -1L。