文件操作会分成一个小续集分次更新,这是第一次
目录
1.前言
2.文件的分类
3..文件的打开和关闭
4.文件的读写
大家还记得我吗之前写过的通讯录吗
https://blog.csdn.net/weixin_71138261/article/details/126999227?spm=1001.2014.3001.5501
是初阶
https://blog.csdn.net/weixin_71138261/article/details/127030054?spm=1001.2014.3001.5501
是进阶的版本
这些我们录入的数据一旦关闭程序,数据也就不复存在了,这样的数据是不持久的,如何让数据持久化是我们政治的思考的问题!
如果我们可以把数据储存在电脑的磁盘文件,或者数据库里,就相当于把数据放在了硬盘上,显然更持久,所以今天我们就来学习一下文件到底是什么东东,以及我们如何上手操作
文件又两种
(1)程序文件,一般是源文件.c 目标.h(windows中一般是.obj) 可执行程序(Windows一般是.exe后缀)
(2)数据文件,存放程序运行时需要读写的数据
现在我们在本系列文件的blog里面讨论的都是数据文件
我们之前讨论的scanf和printf一类终端都是键盘和屏幕
但是现在我们有一种新的方法可以把数据保存在电脑磁盘里,需要的时候取出或者写入
如果还不理解,可以想象一下scanf从缓冲区读取数据,其实这里的数据文件就相当于那个存放了很多数据的缓冲区
文件和人一样也有一个独一无二的“身份证”——文件名
文件名的组成:路径+主体+后缀
每个被使用的文件都在系统缓存上开辟了一个文件信息区,用来存放一个文件的相关信息,这些信息被保存在系统定义的结构体中,命名为FILE
文件指针pf是一个指向FILE类型数据的变量,可以指向文件信息区的数据进而找到所需的文件
每次我们打开文件的时候如果找不到文件就会自动创建一个新的文件
函数的参数有两个,一个是文件名,另一个是要进行的操作
r——打开一个已经存在的文件,只读
w——创建一个空文件,只写。如果文件名已经存在,里面的内容被销毁,这个文件被视作一个新的空文件
a——追加,如果文件不存在,自动创建
r+—— 打开一个必须已经存在的文件,读写
w+——读写,创建一个新的空文件,如果文件名已经存在,里面的内容被销毁
a+——读写,打开一个文件在文件末追加
成功打开返回FILE类型的指针,这个指针可以用来识别未来操作中的流
打开失败返回NULL
fclose——关闭文件
关闭失败返回EOF
最后文件指针不会自动置空要手动
#define _CRT_SECURE_NO_WARNINGS
#include
int main()
{
//FILE *pf=fopen("c:\\learn-to-knock-the-code\\test.txt", "w");
FILE* pf = fopen("test.txt", "w");
if(pf==NULL)
{
perror("fopen");
}
fclose(pf);
pf = NULL;
return 0;
}
字符输入
文本行输入
int main()
{
FILE* pf = fopen("text.txt", "w");
if (pf == NULL)
{
perror("fopen");
return 1;
}
fputc('a', pf); //input a character
fputc('\n', pf);
fputs("befgh\n", pf); //input a string of character
return 0;
}
原本我们是没有创建test这个文件的,使用fopen自动创建之后输入了我想保存的值
字符读取
文本行读取
int main()
{
FILE* pf = fopen("text.txt", "r");
if (pf == NULL)
{
perror("fopen");
return 1;
}
int ch =fgetc(pf); //output a character of the first line
printf("%c", ch);
char arr[] = "#########";
fgets(arr,3,pf); //output the string character and conserve in the arrary ,the numbre is the count you want
printf("%s", arr);
fclose(pf)
pf=NULL;
return 0;
}
发现结果是这样的,也就是在进行文本行读取的时候会把\n也读到!!!
格式化输入
struct Student
{
char name[20];
int age;
};
int main()
{
struct Student s = { 0 };
FILE* pf = fopen("text.txt", "r");
if (pf == NULL)
{
perror("fopen");
return 1;
}
fscanf(pf, "%s %d", s.name, &(s.age));
printf("%s %d", s.name, s.age);
fclose(pf);
pf = NULL;
return 0;
}
格式化输出
struct Student
{
char name[20];
int age;
}s;
int main()
{
FILE* pf = fopen("text.txt", "w");
struct Student s = {"lily",5};
if (pf == NULL)
{
perror("fopen");
return 1;
}
fprintf(pf, "%s %d", s.name,s.age);
fclose(pf);
pf = NULL;
return 0;
}
还会有更精彩的后续哦~