文件:文件是存储在磁盘上的数据结合
分类:文本文件和二进制文件
1. 文本文件ASI文件文本文件一个文件存放一个ASIC字符,也就是一个字节
10000其实也是存放了5个字节的文件,这样的文件方便读取数据,但是这样的文件占的
外存空间比较大,而且在读取在内存中的时候需要将他转换成二进制文件,这样是比较耗费时间的
2. 二进制文件实际上存放的是文件在内存中存储样式,10000在tubc中只占两个字节,所以存储空间较少
所以,计算机中的文件一般都是使用二进制文件来存储的。
磁盘文件:一些数据放在磁盘文件里面需要的时候再输入到内存里面,所以就需要磁盘文件
操作系统对输入输出设备的管理是按照文件的方式来管理的,即输入文件和输出文件
文件缓存区:输入缓存区和输出缓存区
流:标准输入流、标准输出流、错误输出流
流的常用的输出方式有、行缓冲、无缓冲
行缓冲就是现将数据放在缓冲区内,等到输入指定的输出符的时候,数据开始输出到显示器。
就像scanf就是输出了换行的时候才表示输出结束一样
输出文件缓存区
程序数据区(内存)《-------------------》磁盘
输入文件缓存区
系统为每个文件设置了一个位置指针,所以文件指针不是指向了数据的地址,而是指向了文件的位置。
文件三个部分:文件路劲+文件名的主干+文件名的后缀
操作函数:
Fopen("filename","mode") 返回值是一个文件类型的指针
fgetc(FILE *fp) 返回值是文件中的一个字符
fgets(char *buff, int buff_size, FILE *fp)这个时候不需要再带上返回值
feof(FILE *fp)返回值是文件类型的指针,到了文件结束(文件流未EOF)的时候,指针指向空
fclose(FILE *fp)关闭文件,一般不会去使用它的返回值
fputc(char ch, FILE *fp)向文件里面写入一个字符
#include<stdio. h>
#define FILE_NAME "temp.c"
int main(void)
{
FILE *fp;
char ch;
// Open file
fp = fopen(FILE_NAME, "r");
if(fp==NULL){
perror("main");
return -1;
}
// Read char
while(1){
ch = fgetc(fp);
// End of file
if(feof(fp)){
break;
}
printf("%c", ch);
}
// Close file
fclose(fp);
return 0;
}
值得一提的是我们为什么要将打印输出放在最后一步,feof是在fgets或者fgetc之后采取检测文件流是否标志FEOF
如果我们是在前面去检测他的话,那就会出现一个问题,那就是
最后一次读取之后,文件没有结束,buf缓冲区的内容为最后读取的数据,
然后再次进入循环,这个读取数据失败了,但是缓冲区里面的数据还是会输出出来,再下面判断失败才会跳出程序
也就是说这样的话,最后的一个数据会连续输出两次。
而对于fgetc,读取失败之后,他是则是直接返回了一个不可以打印的值,放在缓冲区里面