当前位置: 首页 > article >正文

流刷新定位

一、流的刷新

         int fflush(FILE *fp);

成功时返回0;出错时返回EOF

将流缓冲区中的数据写入实际的文件

Linux下只能刷新输出缓冲区,输入缓冲区丢弃

如果输出到屏幕使用fflush(stdout)

#include <stdio.h>
#include <unistd.h>//sleep的头文件
int main(){
//	printf("abcdefg");
//	fflush(stdout);//将缓冲区的数据输出到屏幕上
	FILE *fp;
	fp = fopen("1.txt","w");
	if(fp == NULL){
		perror("fopen");
		return 0;
	}
	fwrite("abcdef",7,1,fp);
	fflush(fp);//将缓冲区的数据写入实际的文件
	while(1){
		sleep(1);
	}
}

二、流的定位:

long ftell(FILE *stream);//成功时返回流的当前读写位置,出错时返回EOF

long fseek(FILE *stream, long offset,  int whence);//定位一个流,成功返回0,出错时返回EOF

void rewind(FILE *stream);//将流定位到文件开始位置

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以下的文件

#include <stdio.h>
#include <unistd.h>//sleep的头文件
int main(){
	FILE *fp;
	fp = fopen("1.txt","w");
	if(fp == NULL){
		perror("fopen");
		return 0;
	}
	fwrite("abcdef",6,1,fp);
	//fseek(fp,-2,SEEK_CUR);//1.以目前的读写位置往后增加-2个位移量
	//fseek(fp,3,SEEK_SET);//2.从距文件开头3个位移量为新的读写位置
	
	printf("current fp=%d\n",(int)ftell(fp));//定位流的当前读写位置
	rewind(fp);//将流定位到文件开始位置
	printf("After rewind fp=%d\n",(int)ftell(fp));
	fwrite("vvv",3,1,fp);
}

编译告警错误:

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));

表示参数类型不匹配

三、格式化输出 

int fprintf(FILE *stream, const char *fmt, …);//输出到文件 

#include <stdio.h>
int main(){
	FILE *fp;
	int year = 2021;
	int month = 10;
	int day = 1;
 
	fp = fopen("1.txt","w");
	if(fp == NULL){
		perror("fopen");
		return 0;
	}
 
	fprintf(fp,"%d-%d-%d\n",year,month,day);//数据输出到指定文件
}

 int sprintf(char *s, const char *fmt, …);//输出到指定的字符串中

#include <stdio.h>
 
int main(){
	char buf[100] = {0};
	int year = 2023;
	int month = 5;
	int day = 18;
	sprintf(buf,"%d-%d-%d",year,month,day);//数据输出到指定字符串
 
	printf("%s\n",buf);
}

 成功时返回输出的字符个数;出错时返回EOF

四、格式化输入

int sscanf(const char *str, const char *format, ...);//从字符串里读取数据放到变量里

#include <stdio.h>
int main(){
	char buf[100] = {0};
	int year = 2023;
	int month = 5;
	int day = 18;
 
	int syear;
	int smonth;
	int sday;
 
	sprintf(buf,"%d-%d-%d",year,month,day);//数据输出到指定字符串
 
	printf("%s\n",buf);
 
	sscanf(buf,"%d-%d-%d",&syear,&smonth,&sday);//从字符串里面取出数据,放到syear
	printf("%d,%d,%d\n",syear,smonth,sday);
}

int fscanf(FILE *stream, const char *format, ...);//从文件里读取数据到变量里 

#include <stdio.h>
int main(){
	FILE *fp;
	int year;
	int month;
	int day;
 
	fp = fopen("1.txt","r");
	if(fp == NULL){
		perror("fopen");
		return 0;
	}
 
	fscanf(fp,"%d-%d-%d\n",&year,&month,&day);//从文件里读取数据放到变量里
 
	printf("%d,%d,%d\n",year,month,day);
 
	fclose(fp);
}

重点掌握sprintf 和sscanf 

编译告警:

wsystime.c:16:13: warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘time_t {aka long int}’ [-Wformat=]

      printf("ctime=%d\n",ctime);

表示类型不匹配 期望的是int但是参数传的是time_t

解决办法:在参数前加强制类型转换

六、标准IO练习

        time()用来获取系统时间(秒数)

        time_t time(time_t *seconds) 1970.1.1 0:0:0

        localtime()将系统时间转换成本地时间

struct tm *localtime(const time_t *timer)
struct tm {
   int tm_sec;         /* 秒,范围从 0 到 59                */
   int tm_min;         /* 分,范围从 0 到 59                */
   int tm_hour;        /* 小时,范围从 0 到 23                */
   int tm_mday;        /* 一月中的第几天,范围从 1 到 31                    */
   int tm_mon;         /* 月份,范围从 0 到 11                */
   int tm_year;        /* 自 1900 起的年数                */
   int tm_wday;        /* 一周中的第几天,范围从 0 到 6                */
   int tm_yday;        /* 一年中的第几天,范围从 0 到 365                    */
   int tm_isdst;       /* 夏令时                        */   
};

注意:

   int tm_mon;        获取的值要加1是正确的月份
   int tm_year;        获取的值加1900是正确的年份
获取文件内的所有行数量:
   while(fgets(buf,32,fp)!=NULL){
          if(buf[strlen(buf)-1] =='\n'){  //注意判断是否是一行结束
               linecount++;
          }
}

写完文件记得fflush ,写到磁盘里面去。

标准IO磁盘文件的缓冲区一般为4096

注意和标准输出的全缓冲区别,标准输出是1024

/*获取系统时间,输出到屏幕和文件里*/
#include <stdio.h>
#include <time.h>
#include <unistd.h>
#include <string.h>
int main(){
 
	FILE *fp;
	time_t ctime;//时间秒
	int linecount = 0;//行号
	struct tm *ctimestr;
	char buf[32];
	fp = fopen("test.txt","a+");
	if(fp == NULL){
		perror("fopen");
		return 0;
	}
	while(fgets(buf,32,fp)!=NULL){//获取文件内的所有行的数量
		if(buf[strlen(buf)-1] =='\n'){//判断是否是一行结束
			linecount++;
		}
	}
	while(1){
	ctime = time(NULL);//获取系统时间
	//printf("ctime=%d\n",(int)ctime);//打印时间
	ctimestr = localtime(&ctime);//将系统时间转换为本地时间
	printf("%04d-%02d-%02d %02d:%02d:%02d\n",ctimestr->tm_year+1900,ctimestr->tm_mon+1,ctimestr->tm_mday,
								ctimestr->tm_hour,ctimestr->tm_min,ctimestr->tm_sec);//打印输出时间
	fprintf(fp,"%d,%04d-%02d-%02d %02d:%02d:%02d\n",linecount,ctimestr->tm_year+1900,ctimestr->tm_mon+1,ctimestr->tm_mday,
								ctimestr->tm_hour,ctimestr->tm_min,ctimestr->tm_sec);//将时间输出到文件里
	fflush(fp);//刷新缓冲区
	linecount++;
	sleep(1);//休眠1秒
	}
	fclose(fp);
}

 

 


http://www.kler.cn/a/371707.html

相关文章:

  • 【云原生】云原生后端:监控与观察性
  • Topaz Video AI for Mac 视频无损放大软件安装教程【保姆级,操作简单轻松上手】
  • CNAS软件测试的好处有哪些?上海软件测试中心推荐
  • GitHub Actions的 CI/CD
  • 【云计算】KVM虚拟化部署
  • go语言中流程控制语句
  • Ubuntu24.04配置samba共享
  • 微服务的雪崩问题
  • 提问GPT
  • 流媒体协议.之(RTP,RTCP,RTSP,RTMP,HTTP)(三)
  • SpringBoot 下的Excel文件损坏与内容乱码问题
  • Zustand介绍与使用 React状态管理工具
  • Golang的跨平台开发
  • 从零到一:大学新生编程入门攻略与成长指南
  • 【flask-wtf】 表单验证器
  • Spring Boot 集成 Shiro:会话管理、加密与登录次数限制
  • 以太网交换安全:DHCP Snooping
  • 闲话10.40 :)
  • Mac安装Ruby
  • 【含开题报告+文档+PPT+源码】基于SpringBoot的体育馆管理系统的设计与实现
  • 华为应用市场增长优化(一)
  • 使用 Nginx 配置真实 IP 地址转发
  • 华为OD机试真题---狼羊过河
  • 【GO实战课(完结)】第九讲:电子商务网站(9):测试、调试和优化
  • 闲一品交易平台:SpringBoot技术的新境界
  • String的长度有限,而我对你的思念却无限延伸