文件操作基础知识
程序打开文件时,会维护一个文件指针,文件指针指向一个FILE的结构体(也叫文件信息区)通过文件信息区与文件之间的交互实现相关文件操作。
C语言在开始运行时,会默认打开三个流
1.标准输入流---stdin--->用于读取数据
2.标准输出流---stdout--->用于写入数据
3.标准错误流---stderr
文件操作相关函数
fopen-打开文件函数
//打开文件
//注意:程序只能有一种打开方式,这里只是为了方便说明问题将 读和写 写到了一起
//fopen("文件名","打开方式")
FILE* pf = fopen("data.txt", "w");//以写的形式打开-注意,如果是二进制输出则要用wb
//如果以写的形式打开,如果目前没有创建这个文件,则会自动创建文件并打开它
FILE* pf = fopen("data.txt", "r");//以读的形式打开-注意,如果是二进制输入则要用rb
//如果以读的形式打开,如果目前没有创建这个文件,则会打开失败
//如果文件打开失败,则文件指针会返回空指针
if (pf == NULL) {
perror("fopen fail");
exit(-1);
}
fclose-关闭文件函数
//关闭文件
//fclose(文件指针)--释放文件指针之后我们需要将文件指针制空,防止成为野指针
fclose(pf);
pf = NULL;
fgetc-字符输入函数
//打开文件
FILE* pf = fopen("data.txt", "r");//以读的形式打开
if (pf == NULL) {
perror("fopen fail");
exit(-1);
}
//字符输入函数
int n = fgetc(pf);
printf("%c\n",n);
//我们从pf所指的文件中读取数据到n中去,再将n以字符形式打印
//关闭文件
fclose(pf);
pf = NULL;
fputc-字符输出函数
//打开文件
FILE* pf = fopen("data.txt", "w");//以写的形式打开
if (pf == NULL) {
perror("fopen fail");
exit(-1);
}
//字符输出函数
//fputc('需要写入的字符',文件指针)
fputc('a', pf);
fputc('b', pf);
fputc('c', pf);
fputc('d', pf);
//我们依次将abcd字符写入pf文件指针所指的文件中过去
//关闭文件
fclose(pf);
pf = NULL;
fgets-文本行输入函数
//打开文件
FILE* pf = fopen("data.txt", "r");//以读的形式打开
if (pf == NULL) {
perror("fopen fail");
exit(-1);
}
//文本行输入函数
char a[10] = { 0 };
//fgets(数组,读取n个,文件指针)
//注意:这里的n指的是读取的个数,但实际上只会读取到前n-1个,会将第n个改为 '\n'
//所以fgets的结束有两种方式
//1.读取了n-1个数据,将第n个改为 '\n'结束
//2.读取n个的过程中,读到了'\n'结束
fgets(a, 3, pf);
//我们将pf所指的文件中的数据的前三个输入到a数组中去
printf("%s\n",a);
//关闭文件
fclose(pf);
pf = NULL;
fputs-文本行输出函数
//打开文件
FILE* pf = fopen("data.txt", "w");//以写的形式打开
if (pf == NULL) {
perror("fopen fail");
exit(-1);
}
//文本行输出函数
//fputs("所要书写的内容",文件指针)
fputs("xxxxx", pf);
//我们将xxxxx字符串写入pf所指的文件中去
//关闭文件
fclose(pf);
pf = NULL;
fscanf-格式化输入函数
struct S {
int x;
float y;
char z;
};
int main() {
//打开文件
FILE* pf = fopen("data.txt", "r");//以读的形式打开
if (pf == NULL) {
perror("fopen fail");
exit(-1);
}
//格式化输入函数
struct S s1;
//fscanf(文件指针,"%d %f %c",&(s1.x),&(s1.y),&(s1.z))
fscanf(pf, "%d %f %c", &(s1.x), &(s1.y), &(s1.z));
printf("%d %f %c\n",s1.x,s1.y,s1.z);
//我们将pf所指的文件中的数据以%d %f %c的形式写到s1结构体中去,之后将其打印
//关闭文件
fclose(pf);
pf = NULL;
return 0;
}
fprintf-格式化输出函数
struct S {
int x;
float y;
char z;
};
int main() {
//打开文件
FILE* pf = fopen("data.txt", "w");//以写的形式打开
if (pf == NULL) {
perror("fopen fail");
exit(-1);
}
//格式化输出函数
struct S s1 = {10,3.14,'a'};
//fprintf(文件指针,"%d %f %c",)
fprintf(pf, "%d %f %c", s1.x, s1.y, s1.z);
//我们将s1这个结构体中的数据以%d %f %c这种格式写到pf所指的文件中去
//关闭文件
fclose(pf);
pf = NULL;
return 0;
}
sprintf函数
struct S {
int x;
float y;
char z;
};
int main() {
//sprintf函数
//sprintf(接受的空间,"%d %f %c",读取内容处)
char arr[20];
struct S s1 = { 10,3.14,'a' };
sprintf(arr, "%d %f %c", s1.x, s1.y, s1.z);
printf("%s\n",arr);
//我们将s1结构体中的数据以%d %f %c的形式放到arr数组中去(以字符形式存储),之后将其打印
//关闭文件
fclose(pf);
pf = NULL;
return 0;
}
sscanf函数
struct S {
int x;
float y;
char z;
};
int main() {
//sscanf函数
//sscanf(读取内容处,"%d %f %c",接收空间地址)
char arr[20] = "10 3.140000 a";
struct S s2 = { 0 };
sscanf(arr, "%d %f %c",&(s2.x),&(s2.y),&(s2.z));
printf("%d %f %c\n",s2.x,s2.y,s2.z);
//我们将arr数组中的数据以%d %f %c的形式放到s2结构体中去,之后将其打印
//关闭文件
fclose(pf);
pf = NULL;
return 0;
}
fwrite-二进制输出函数
struct S {
int x;
float y;
char z;
};
int main() {
//打开文件
FILE* pf = fopen("data.txt", "wb");//以读的形式打开
if (pf == NULL) {
perror("fopen fail");
exit(-1);
}
//二进制输出函数
struct S s1 = { 10,3.14,'a' };
//fwrite(输入数据的地址,所占空间大小,个数,文件指针)
fwrite(&s1, sizeof(s1), 1, pf);
//我们将s1结构体中的数据,写到pf所指向的文件中去
//关闭文件
fclose(pf);
pf = NULL;
return 0;
}
fread-二进制输入函数
struct S {
int x;
float y;
char z;
};
int main() {
//打开文件
FILE* pf = fopen("data.txt", "rb");//以读的形式打开
if (pf == NULL) {
perror("fopen fail");
exit(-1);
}
//二进制输出函数
struct S s1;
//fread(被写入空间的地址,所占空间大小,个数,文件指针)
fread(&s1, sizeof(s1), 1, pf);
printf("%d %f %c\n", s1.x, s1.y, s1.z);
//我们将pf指针所指向的文件中的内容,写到&s1地址所指的空间中去,打印查看结果
//关闭文件
fclose(pf);
pf = NULL;
return 0;
}
对比scanf/fscanf/sscanf函数
scanf:从键盘获取数据----------------------------------------------------------------------------->从键盘获取
fscanf:从文件中去读取格式化数据并赋值给相应的结构体变量中---------->从文件到结构体变量
sscanf:从数组中获取相应的格式化数据赋值到结构体变量中---------------->从数组到结构体变量
对比printf/fprintf/sprintf函数
printf:向屏幕输出想要的格式化的数据------------------------------------------------------>写到屏幕上去
fprintf:向文件指针所指的文件中书写格式化的数据------------------------------>从结构体写到文件上
sprintf:将格式化的数据输出到一个数组中去并以数组的形式存储起来----------->从结构体到数组
我们也可在写的状态下使用stdout将数据写到屏幕上,在读的状态下使用stdin从键盘中获取数据。
最后,如有不足,请各位大佬指正!!!