目录
一、文件流的刷新和定位
一、标准IO-刷新流
int fflush(FILE *fp); //(输出到的位置)
返回值:成功时返回0;出错时返回EOF
功能:将流缓冲区中的数据写入实际的文件
Linux下只能刷新输出缓冲区,输入缓冲区丢弃
如果输出到屏幕使用fflush(stdout)
#include<stdio.h>
#include<stdlib.h>
int main(int argc, const char *argv[])
{
printf("abcde");
//fflush(stdout);//不加fflash不会输出,因为缓冲区没满。加了就可以直接输出
while(1){
sleep(1);
}
return 0;
}
结果:
二、定位流 – ftell/fseek/rewind
long ftell(FILE *stream);
long fseek(FILE *stream, long offset, int whence); //(定位的文件,偏移量,从哪儿偏移)
void rewind(FILE *stream);
ftell() 成功时返回流的当前读写位置,出错时返回EOF
fseek()定位一个流,成功时返回0,出错时返回EOF
fseek 参数whence参数:SEEK_SET/SEEK_CUR/SEEK_END
SEEK_SET 从距文件开头 offset 位移量为新的读写位置
SEEK_CUR:以目前的读写位置往后增加 offset 个位移量
SEEK_END:将读写位置指向文件尾后再增加 offset 个位移量
offset参数:偏移量,可正可负
注意事项:
1.文件的打开使用a模式 fseek无效
2.rewind(fp) 相当于 fseek(fp,0,SEEK_SET);//将流定位到文件开始位置
3.这三个函数只适用2G以下的文件
编译告警错误:
ffseek_t.c:13:11: warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘long int’ [-Wformat=]
printf("current fp=%d\n",ftell(fp));
表示参数类型不匹配
解决办法:在参数前添加强制类型转换
#include<stdio.h>
int main(int argc, const char *argv[])
{
FILE *fp;
fp = fopen("1.txt","w");//a模式下fseek函数失效
if(fp==NULL){
perror("fopen:");
return 0;
}
fwrite("abcdef"