文件操作
Ⅰ 文件和文件控制块
A.文件的定义
文件是计算机表达信息的最小逻辑单位,是信息二进制化在外存中的集合。
B.文件控制块(FCB)
为了能对一个文件进行正确的存取,必须为文件设置用于描述和控制文件的数据结构,称之为“文件控制块(FCB)。
操作系统的FCB,在不同系统的程序设计语言中,对应的名字不同,但是本质的数据类型是一样的,在C语言中,对应的便是FILE类型。
关于FCB有以下几点需要注意:
- FCB是操作系统珍贵的有限资源。
- 操作系统对文件的操作必须通过FCB进行。
因此,FILE是操作系统有限的资源,在对文件进行操作前,必须先申请这个资源。
Ⅱ 文件操作
C语言对文件的操作要通过FILE类型,通常的操作顺序:
- 打开文件 (其本质为申请FCB)
- 读、写文件
- 关闭文件 (其本质为归还FCB)
FILE *fp; //fp为指针类型,不是FILE实例
fp = fopen(文件名, 打开方式);
FILE *fopen(const char *fileName, const char *mode);
fclose(FILE *)
fileName为文件名。
mode包含两部分内容:
1.操作方式
r | read only(只读,默认方式) |
---|---|
w | write(创建/改写) |
a | append(追加写) |
r+ | 既读又写 |
2.识别方式
t | text / ASCII(文本文件,字节流文件,非格式化文件) |
---|---|
b | binary(二进制文件,格式化文件) |
两个注意事项:
1.以r方式打开某文件,若该文件不存在,则fopen()返回NULL,表示申请 FCB失败;
2.以w方式打开某文件,若该文件不存在,则创立该文件,且为空文件。若该文件存在,则会清空原来文件的所有内容。
Ⅲ 文件操作函数
A. fopen() & fclose()
fopen()原型为 FILE * fopen(const char * path,const char * mode);其本质是申请FCB资源;
fclose()原型为 int fclose(FILE *stream);其本质是归还FCB资源。
B. fprintf() & fscanf()
关于fprintf() 和 fscanf()两个函数,有两个需要注意的地方:这两个函数,无论文件是以 t方式 打开,还是以 b方式 打开,其内容都是文本,即ASCII码。,所以写进去的数据,本质都是字符串,读数据会将字符串转为需要的数据类型,然后读出。
进行一次读写操作后,位置指针向后移,且fscanf()遇到空格和换行时结束,注意空格时也结束。
a. fprintf()
原型:int fprintf (FILEstream,const charformat, [argument])
功能:向文件指针所指向的文件中写入相应类型的数据。
返回值:若成功,返回输出字符数;若失败,则返回负值。
printf("%d %d", 5, 684) == fprintf(文件指针, “%d %d”, 5, 684);
测试代码如下👇
#include <stdio.h>
int main() {
int a = 3;
int b = 5;
FILE *fp;
fp = fopen("test1.txt", "w");
fprintf(fp, "%d %d\n", a, b);
fclose(fp);
return 0;
}
程序运行结束,文件夹里便多了一个文件。
内容为
可以看到,a和b的值通过fprintf()写入了文件中。
b. fscanf()
原型:int fscanf(FILEstream,charformat,[argument…]);
功能:从文件指针所指的文件中读取数据并赋值给变量
返回值:返回成功读取的数据个数,若文件中没有数据可以读,则返回-1。
测试代码如下👇
#include <stdio.h>
int main() {
int a;
int b;
FILE *fp;
fp = fopen("test1.txt", "r");
fscanf(fp, "%d %d", &a, &b);
printf("%d %d\n", a, b);
fclose(fp);
return 0;
}
结果为👇
可以看到成功的从我用fprintf()写入的文件中读取了3 和 5并赋值给 a 和 b。
关于fscanf()的返回值我也做了测试,代码如下👇
#include <stdio.h>
int main() {
int a;
int b;
int c;
FILE *fp;
fp = fopen("test1.txt", "r");
c = fscanf(fp, "%d %d", &a, &b);
printf("%d %d\n", a, b);
printf("%d\n", c);
fclose(fp);
return 0;