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
02 错误码
03 fputc和fgetc的使用
04 fputs的使用
01 验证全缓冲,行缓冲,无缓冲的大小
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 输出时间
05 snprintf (数组)
06 fprintf,fscanf格式化输入、输出 (从文件中)
07 fread,fwrite读写字符串,整形变量
09 fread,fwrite读写结构体数据
10 feof,ferror
11 fseek
以a+的形式打开文件,开头读,结尾写,使用fseek可以更改读指针的位置,但是,不能更改写指针位置
12 fseek: 修改光标位置