TIPS
- 文件的顺序读写:fgetc, fputc, fputs(一行字符串的输出+\n注意一下), fgets(一行字符串的输入+\n三特性),fprintf(格式化字符串的输出+联想printf很简单),fscanf(格式化字符串的输入+文件指针自己会换行)+ sprintf(随意粘连任何已有东西+自己添油加醋+组成一个新字符串)+sscanf(随意从已有字符串中抠来东西+放到其他变量当中)+fread + fwrite
- 文件里面放的要么就是二进制,要么就是ASCII码,点开文件,会把文件内容全部解析成字符形式给你看,所以二进制文件看不懂是乱码,而文本文件看得懂
文件的随机读写(指哪打哪)
- 一旦打开文件,有个闪烁的光标(其实就是说刚开始打开文件的时候,文件指针是默认指向第一个字符的),这是最开始的状态。
- 然后当你用fgetc()输入一个字符后,此时文件指针就不指向第一个字符了,往后走一步指向第二个字符去了。
- 再用fgetc()不断去读,文件指针就不断往后偏移,一个一个字符不断读下去。这就是顺序读写,那如果说你想控制顺序跳过字符或者回去读之类的…这时候就用fseek去手动调整指针指向的位置
- 但无论任何时候,默认的"读一下,往右偏移一个字符"这个铁律永远都在
fseek()
- 根据文件指针FILE*的当前位置和你给出的偏移量来让它这个文件指针呢定位到你想要的位置上去。
- 就是说我想让文件指针偏移到哪里,你就给我偏移到哪里
- 它这个函数有三个参数:FILE* stream,long int offset(偏移量),int origin(起始位置)
- 其中第三个参数int origin是有选项的。关于这个参数有三个选项:SEEK_SET,就是说从文件的起始位置开始算起;SEEK_CUR,从当前文件指针的位置算起;SEEK_END,就是说从文件的末尾开始算起。
- 演示代码:
int main()
{
FILE* pf = fopen("test.txt", "r");
if (pf == NULL)
{
perror("fopen failed");
return;
}
fseek(pf, 3, SEEK_SET);
char arr[25] = { 0 };
fgets(arr, 22, pf);
printf("%s\n", arr);
fclose(pf);
return 0;
}
ftell() 当前指针位置相当于起始位置的偏移量
rewind() 让指针回到起始位置
文件知识总结回顾
- 文件的话被分为程序文件与数据文件,然后数据文件又被分为文本文件与二进制文件。
- 当你打开文件的时候,都是把文件内容解析成字符呈现在电脑屏幕面前的你。
- 首先,数据在电脑当中是以二进制补码的形式存储,如果说对内存里面的数据(纯纯的二进制)不加以任何转换输出到外存的话,比如说给他输出到硬盘上面,对于硬盘而言,它唯一的存储形式就是文件存储,此时此刻就是二进制文件。
- 那我如果想要在外层上以ACSII码值的形式存储,那么就需要在存储之前转换。以ASCII字符形式存储的都是文本文件。
- 一个整形占四个字节,一个字节就是八个二进制位,或者说八个比特位,每四个二进制位可以合成一个16进制位,因此一个字节相当于也是两个16进制位。
- 当然,这里面还有一个大小端的问题,如果你在内存里面以小端形式存储,那么也会直接以小端的形式写到文件里面去(对于二进制文件)
- 实例演示
1. 比如说对于一个数值10000。如果我要把它存起来。我们知道这个10000在内存里面就是00…0010011100010000。如果说我们把这个二进制序列不做任何转换直接存到文件里面去,此时这个文件就是二进制文件。
2. 如果说我们把10000的每一位都当成字符即:“1”,“0”,“0”,“0”,“0”。然后把每个字符对应的ASCII码值存到文件里面去。这时候这个文件就是文本文件。
3.
int main()
{
FILE* pf = fopen("test.txt", "wb");
if (pf == NULL)
{
perror("fopen failed");
return;
}
int num = 10000;
fwrite(&num, sizeof(num), 1, pf);
fclose(pf);
return 0;
}
文件缓冲区回顾
- ANSIC标准采用“缓冲文件系统”来处理数据文件。
- 所谓“缓冲文件系统”,指系统自动地在内存中为程序中正在运行的每一个文件开辟一块“文件缓冲区”。
(文件就是在电脑磁盘里面) - 内存数据输出/写到磁盘里面,其会先被送到内存中的输出缓冲区,装满缓冲区后再一次性送到磁盘里面/或者说我主动刷新一下缓冲区里面的数据然后放到硬盘里面去。
(然后假设我缓冲区一直没满,但是我要关闭文件了,这时候没关系,系统会刷新一份缓冲区的数据,这时候不管满没满了,文件都要关闭了,直接把数据放到文件里面去,然后才关闭文件,所以fclose本身关闭文件的时候也会刷新缓冲区的) - 如果从磁盘里面往内存输入/读数据,数据也是先放到缓冲区。充满缓冲区后,然后再从缓冲区里面逐个地将数据送到程序数据区(程序变量等)。
- 缓冲区大小根据C编译系统决定。
- 缓冲区也是在内存里面的,当然了,摸不着看不到的。