【IO】Day2

1> 向文件中输出时间,并且是每一秒更新一次,按ctrl+c停止输出后,下次再运行./a.out会继续想文件中接着输出

        1:2023-6-21 11:57:54

        2:2023-6-21 11:57:55

        3:2023-6-21 11:57:56

        停止上一个程序,再次运行

        4:2023-6-21 11:59:20

        5:2023-6-21 11:59:21

#include 
#include 
#include 
#include 
#include 

//输出时间
int main(int argc, const char *argv[])
{
	
	FILE *fp=fopen("./time.txt","a+"); //定义文件指针.以追加读写形式打开文件
	if(fp==NULL)  //以只读形式打开文件1
	{
		perror("fopen error");
		return -1;
	}
	
	int count=0;  //定义行计数变量
	char buf[100]; //定义一个容器存放读取的字符,最多100个
	while((fgets(buf,sizeof(buf),fp)) != NULL)  //读取内容到buf
	{	
		if(buf[strlen(buf)-1]=='\n')
		{
			count++;  //读取倒数第二个字符是换行时+1
		}			
	}
	

//定义时间类型,保持秒数
	time_t sys_time;
//调用time函数,获取秒数
	struct tm *t;
//输出获取的时间
	while(1)
	{
		count++;
		time(&sys_time);
		t=localtime(&sys_time);	//调用将秒数转换成时间指针
		//输出获取的时间
    	fprintf(fp,"%d:%4d-%d-%02d %02d:%02d:%02d\n",count,t->tm_year+1900, t->tm_mon+1, \
				t->tm_mday,t->tm_hour, t->tm_min, t->tm_sec);
		fflush(fp);
		sleep(1);  //延时1s
	}
	fclose(fp);  //关闭文件
	return 0;
}

运行后文件中保存结果:

1:2023-6-23 15:51:25
2:2023-6-23 15:51:26
3:2023-6-23 15:51:27
4:2023-6-23 15:51:28
5:2023-6-23 15:51:29
6:2023-6-23 15:51:38
7:2023-6-23 15:51:39
8:2023-6-23 15:51:40
9:2023-6-23 15:51:41

2> 使用fread、fwrite完成两个文件的拷贝

#include 
#include 
#include 
//argc:执行文件时传入文件的个数
//argv:文件数组

int main(int argc, const char *argv[])
{
		//判断文件个数是否为3
		if(argc!=3)
		{
			printf("输入的文件错误\n");
			printf("usage:./a.out srcfile dstfile\n");
			return -1;
		}

		FILE *fp1=fopen(argv[1],"r"); //定义文件指针以只读形式打开
		FILE *fp2=fopen(argv[2],"w"); //定义文件指针以只写形式打开
		if(fp1==NULL || fp2==NULL)  
		{
			perror("fopen error");
			return -1;
		}

		char buf[1024]="";      //定义一个容器存放读取的字
        int ret;
		while(!feof(fp1))  //从fp1文件中读取内容到buf,NULL为读取到文件末尾或读取失败
		{	
			
			ret=fread(buf,1,sizeof(buf),fp1);
			fwrite(buf,1,ret,fp2);
		}
		fclose(fp1);
		fclose(fp2);
		printf("拷贝成功\n");

		return 0;
}

运行结果如下:

ubuntu@ubuntu:homework$ gcc 2copy.c 
ubuntu@ubuntu:homework$ ./a.out test.txt  aa.txt
拷贝成功

3> 将课堂上的所有课堂代码,重新敲一遍(必须上交链接)

01 fopen和fclose

【IO】Day2_第1张图片

02 错误码

【IO】Day2_第2张图片

 03 fputc和fgetc的使用

【IO】Day2_第3张图片

【IO】Day2_第4张图片

 04 fputs的使用

【IO】Day2_第5张图片

 01  验证全缓冲,行缓冲,无缓冲的大小

【IO】Day2_第6张图片

  02 验证行缓冲的刷新机制

#include 
#include 
#include 

int main(int argc, const char *argv[])
{
//1.当缓存区没有到刷新时机时,不会刷新缓存区
//	printf("hello world");
//	while(1);
/*
//2.遇到换行符时会刷新缓存区
	printf("hello world\n");
	while(1);

//3.当程序结束后会自动刷新缓存区
	printf("hello world");

//4.当关闭文件指针时,会刷新缓存区
	printf("hello world");
	fclose(stdout);  //手动关闭标准输出文件指针
	while(1);

//5.当使用fflush函数刷新时,也会刷新缓存区
	printf("hello world");
	fflush(stdout);   //手动刷新缓存区
	while(1);*/

//6.当缓存区满了,也会刷新缓存区
	for(int i=0;i<1026;i++)
	{
		printf("a");
	}
	while(1);

//7.当输入输出发生切换时也会刷新缓存区
	int num;
	printf("请输入一个整数:");
	scanf("%d",&num);
	while(1);

	return 0;
}

 03 验证全缓冲的刷新机制

#include 
#include 
#include 

//验证刷新全缓存的机制

int main(int argc, const char *argv[])
{
	FILE *fp;
	if((fp=fopen("./01test.txt","w")) == NULL)
	{
		perror("fopen error");
		return -1;
	}
/*
//1.当遇到换行符号时,不会刷新全缓存
	fputs("hello world\n",fp);
	while(1);

//2.当程序结束后,会刷新全缓存
	fputs("hello world",fp);

//3. 当关闭文件指针时,会刷新全缓存
	fputs("hello world",fp);
	fclose(fp);
	while(1);
*/
//4.当使用fflush函数刷新时,会刷新全缓存
	fputs("hello world",fp);
	fflush(fp);
	while(1);

//5. 当全缓存满了后,会刷新全缓存
	for(int i=0;i<4098;i++)
	{
		fputc('a',fp);  //全缓存4096,超过部分也不刷新
	}
	while(1);

//6.当输入输出切换时,会刷新全缓存
	fputc('H',fp);
	fgetc(fp);
	while(1);

	return 0;
}

 04 time 输出时间

【IO】Day2_第7张图片

05 snprintf (数组)

【IO】Day2_第8张图片

06 fprintf,fscanf格式化输入、输出 (从文件中)

【IO】Day2_第9张图片

07 fread,fwrite读写字符串,整形变量

【IO】Day2_第10张图片

【IO】Day2_第11张图片

 09 fread,fwrite读写结构体数据

【IO】Day2_第12张图片

 10 feof,ferror

【IO】Day2_第13张图片

 11 fseek

以a+的形式打开文件,开头读,结尾写,使用fseek可以更改读指针的位置,但是,不能更改写指针位置

【IO】Day2_第14张图片

12 fseek: 修改光标位置

【IO】Day2_第15张图片

你可能感兴趣的:(linux)