文章目录
1.为什么使用文件
在我们之前写程序时发现当程序结束时,程序中的数据就消失了。为了保存数据,我们就将数据存放在文件中,以到达永久保存数据。
2.什么是文件
磁盘上的文件就是文件。
在程序设计时,我们一般谈的文件有两种:程序文件、数据文件(从文件功能的角度来分类的).
2.1程序文件
包括源程序文件(后缀.c),目标文件(.obj),可执行文件(.exe).
2.2数据文件
文件的内容不一定是程序,而是程序运行的数据。比如程序运行需要读取的数据文件和输出内容的文件
2.3文件名
一个文件只有一个唯一的名字
文件名包含3个部分:文件路径+文件名主干+文件后缀
如:c:\code\test.txt
3.文件的打开和关闭
3.1文件指针
每一个在使用的文件都会在内存开辟一块文件信息区存放相关信息。这些信息存放在一个结构体变量中,这个结构体类型由系统声明,取名FILE.
我们无需关注细节过程,只要通过一个指针来维护这个FILE结构的变量,
FILE*pf;//文件指针变量
3.2文件的打开与关闭
FILE*pf=fopen("C:\\Users\\Administrator\\Desktop\\文件的操作\\1.dat", "w");
if (pf == NULL)
{
perror("fopen");
return 1;
}
fclose(pf);
pf = NULL;
fopen需要文件的地址为参数,但直接复制地址是无法运行,因为编译器将\和后面的字符当作转义字符,我们需要将每个斜杠\换为双斜杠\\
绝对路径:包含文件路径,文件主干,后缀的文件地址,可访问计算机上任意文件
相对路径:只包含文件主干和后缀,需要文件在当前程序的文件夹当中才允许访问
在“w"和“wb"中如果文件存在,会将原来内容清空,然后在写,没有就会在文件名下新建一个文件
“a”和“wa” 为了追加,不会将内容摧毁的条件下写。
4.文件的顺序读写
程序从文件中读取数据称为输入或读取
程序将数据写入硬盘(文件)称为输出或写入
流
流:高度抽象的概念。
在c语言程序运行时,会默认打开三个流
stdin—标准输入流—键盘
stdout—标准输出流—屏幕
stderr—标准错误流—屏幕
输入输出函数
fputc函数
写入文件
FILE*pf=fopen("1.dat", "w");
if (pf == NULL)
{
perror("fopen");
return 1;
}
//写文件
fputc('b',pf);
fclose(pf);
pf = NULL;
写入屏幕
fputc('b',stdout);
fgetc函数
当读取成功时返回字符的ASCLL值。当读取失败或文件到达末尾时返回EOF.
从文件中读取数据
int ret=fgetc(pf);
从标准输入流中读取数据
int ret=fgetc(stdin);
fguts函数
fputs("abcdef\n", pf);
fputs("abcdef\n", pf);
想要在文本中换行要在fputs中体现出来
fgets函数
从文件中一行一行的读取数据
char arr[10];
fgets(arr, 4, pf);
printf("%s\n", arr);
fgets函数第一个参数为读入后存放的地址,第二个参数为要读入的个数,第十个为文件指针
实际读入字符个数为第二个参数-1。因为还要给\0留位置
注意:当一行字符为读取完毕时,再次使用不会直接换行,而是继续从上一个的末尾开始读取。当一行读取完毕时,函数会自动停止。fgets函数会读取之前输入的换行符
fprintf函数
将格式化的数据(结构体)写入文件
参数类型:在printf函数的参数前面加上文件指针。
struct S s = { "abcdef",10 };
fprintf(pf, "%s %d\n", s.arr, s.a);
fscanf函数
struct S s ;
fscanf(pf, "%s %d\n", s.arr, &(s.a));
printf("%s %d\n", s.arr, s.a);
fwrite函数
以二进制的方式写入文件
struct S s ={"ertyu",10};
fwrite(&s, sizeof(struct S), 1, pf);
字符串以二进制的形式写入和以文本类型写入无区别,但在。数字则不同,以二进制写入我们无法读懂。
fread函数
从二进制文件中读入数据
struct S s ;
fread(&s, sizeof(struct S), 1, pf);
printf("%s %d\n", s.arr, s.a);