目录
一. 文件的随机读写
二.文件缓冲区
进度条
一. 文件的随机读写
我们在使用完文件指针的时候,指针指向的是数据的末尾,那么如果要更改这个指针的位置,我们就要了解这几个函数:fseek(根据文件指针的位置和偏移量来定位文件指针),ftell(返回文件指针相对于起始位置的偏移量),rewind(让文件指针的位置回到文件的起始位置)。
首先我们通过fseek来看一下接下来需要用到的几个参数:
指针的位置我们可以用这三个来确定指针位置
- SEEK_CUR 文件指针当前的位置
- SEEK_END 文件末尾的位置
- SEEK_SET 文件开始的位置
假设在test文件中存入了abcdefg。通过下图我们可以了解fseek的原理。
因为上面将偏移量改为2后又使用了一次fgetc函数,所以此时 指针指向的是d,因此结果为3。
接下来是rewind
二.文件缓冲区
我们可以将内存向磁盘输出数据的过程想象为一个送快递的过程,假设A买了10个物品,如果快递员每收到一个快递就将其送到A的手上,这样的效率就很低。
那么如将这个快递先存入快递点,等到10个快递都到了的时候,再将他们一块送到A的手上,这样效率就得到了很大的提升。在这个过程中A就是磁盘,商家就是程序数据区,而快递点就是我们的文件缓冲区。同理,我们在从磁盘中读取数据时也是要经过文件缓冲区的。
这里我们要注意只有缓冲区刷新或是程序结束时的时候,才能将缓冲区的数据写入磁盘。这个过程可以通过以下代码来进行验证。
int main()
{FILE*pf = fopen("test.txt", "w");fputs("abcdef", pf);//先将代码放在输出缓冲区printf("睡眠10秒\n");Sleep(10000);printf("刷新缓冲区\n");fflush(pf);printf("再睡眠10秒\n");Sleep(10000);fclose(pf);//fclose在关闭文件的时候,也会刷新缓冲区pf = NULL;return 0;
}
进度条
首先要知道回车\r与换行\n的效果是不同的,回车是把光标移到开始,换行是跳到下一行。
由于\r并不会换行,所以我们可以通过不断的刷新缓冲区,来实现进度条的效果
int main()
{int n=0;char arr[101]={0};const char* flag = "|/-\\";while(n<100){arr[n++]='#';printf("%-100s %d%% %c\r",arr,n,flag[n%4]);fflush(stdout);//刷新缓冲区usleep(30000);}printf("\n");return 0;
}