文件的分类
按数据性质分类
程序文件、数据文件
按数据的编码方式
ASCII 文件、二进制文件
文件指针与文件内部指针
文件指针 FILE 应该是一个结构体类型,包含文件的各种信息,通过 fopen()赋值。
对文件操作时,文件内部也有一个指针,开始时指向最前面,每次读写该指针都会向后移动。
对文件的操作
- 打开
- 读写
- 关闭
文件的打开与关闭
| 1 | FILE * fp; | 
用 fopen()函数打开文件,指针文件位置和打开方式。
打开方式包括:
- rt 只读 ASCII 码文件
- wt 只写 ASCII 码文件
- at 追加 ASCII 码文件
- rb 只读二进制文件
- wb 只写二进制文件
- ab 追加二进制文件
- rt+ 以读的方式打开 ASCII 码文件,允许写入
- wt+ 以写的方式打开 ASCII 码文件,允许读取
- at+ 以追加的方式打开 ASCII 码文件,允许读写
- rb+ 以读的方式打开二进制文件,允许写入
- wb+ 以写的方式打开二进制文件,允许读取
- ab+ 以追加的方式打开二进制文件,允许读写
文件的关闭1
fclose(fp);
文件顺序读写
文件读写函数
- 对 ASCII 码文件的读写
- fgetc( ) 从文件中读取一个字符 - 1 
 2
 3
 4
 5
 6
 7- ch = fgetc(fp); 
 while(ch!=EOF)
 {
 putchar(ch);
 ch = fgetc(fp);
 }
 //使用 fgetc() 读取一个字符,只要读取到的不是 EOF 就继续读取。(EOF 是文件结束标志)
- fputc( ) 向文件中写入一个字符 - 1 
 2
 3
 4
 5
 6
 7- ch = getchar(); //从已经输入的字符串中读取一个字符 
 while(ch != '\n')
 {
 fputc(ch, fp);
 ch = getchar();
 }
 //只要读取到的字符不是 '\n' 就往下读取
- fgets( ) 从指定文件读取一个字符串放到字符数组 - 1 
 2- fgets(str, 5, fp); 
 //分别对应字符数组,要读取的字数个数,要读取的文件
- fputs( ) - 1 
 2
 3
 4- char st[20]; 
 scanf("%s", st); //从键盘输入字符串
 fputs(st, fp); //将字符串写入文件中
 //fputc 是每次写入一个字符,而 fgets 是写入一个字符串
- 对二进制文件的读写 
- fwrite( ) 写数据块 - 1 
 2
 3
 4
 5
 6
 7- fwrite(pp, sizeof(struct stu), 2, fp); 
 /*
 pp 是结构体数组的首地址,这个位置放的是指针,表示存放输入数据的首地址。
 sizeof(struct stu) 是数据块的字节数
 2 表示要写入的数据块数量,这里的结构体数组有两个元素,所以是 2
 fp 是文件指针
 */
- fread( ) 读数据块 - 1 
 2- fread(qq, sizeof(struct stu), 2, fp); 
 //含义与上面相似,qq 也是结构体类型数组。
- 从文件中读写数据 
注意:fscanf 是从文件往内存中发送数据,fprintf 是将内存数据写入文件中,这里是与直觉相反的
- fprintf( ) - 1 
 2
 3
 4
 5
 6- 格式: 
 fprintf(文件指针, 格式字符串, 输出表列);
 例子:
 fprintf(fp, "%s%d%d%s", pp->name, pp->num, pp->age, pp->addr);
 //pp 是一个结构体指针,pp->name 等指向了内存中的数据,这条语句是将这些数据写入到文件中。
 //注意格式字符串是有双引号的
- fscanf( ) - 1 
 2
 3
 4
 5- 格式: 
 fscanf(文件指针, 格式字符串, 输入表列);
 例子:
 fscanf(fp, "%s%d%d%s", qq->name, &qq->name, &qq->age, qq->addr);
 //qq 是结构体指针,qq->name 等是内存中存在的变量。需要注意的是,fscanf 会给内存中变量赋值,所以需要取变量地址
其他部分函数
| 1 | feof(fp); | 
| 1 | rewind(fp); |