文件的分类
按数据性质分类
程序文件、数据文件
按数据的编码方式
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
7ch = fgetc(fp);
while(ch!=EOF)
{
putchar(ch);
ch = fgetc(fp);
}
//使用 fgetc() 读取一个字符,只要读取到的不是 EOF 就继续读取。(EOF 是文件结束标志)fputc( ) 向文件中写入一个字符
1
2
3
4
5
6
7ch = getchar(); //从已经输入的字符串中读取一个字符
while(ch != '\n')
{
fputc(ch, fp);
ch = getchar();
}
//只要读取到的字符不是 '\n' 就往下读取
fgets( ) 从指定文件读取一个字符串放到字符数组
1
2fgets(str, 5, fp);
//分别对应字符数组,要读取的字数个数,要读取的文件fputs( )
1
2
3
4char st[20];
scanf("%s", st); //从键盘输入字符串
fputs(st, fp); //将字符串写入文件中
//fputc 是每次写入一个字符,而 fgets 是写入一个字符串对二进制文件的读写
fwrite( ) 写数据块
1
2
3
4
5
6
7fwrite(pp, sizeof(struct stu), 2, fp);
/*
pp 是结构体数组的首地址,这个位置放的是指针,表示存放输入数据的首地址。
sizeof(struct stu) 是数据块的字节数
2 表示要写入的数据块数量,这里的结构体数组有两个元素,所以是 2
fp 是文件指针
*/fread( ) 读数据块
1
2fread(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); |