1.使用fread和fwrite完成两个文件的拷贝,要求源文件和目标文件由外界输入
#include<myhead.h>
typedef struct sockaddr_in addr_in_t;
typedef struct sockaddr addr_t;
typedef struct sockaddr_un addr_un_t;
int main(int argc, const char *argv[])
{
//若外部参数不够,直接结束函数
if(argc<3)
{
printf("参数不足\n");
return 0;
}
//向要读取的内容的文件写入数据
FILE* fp1=fopen(argv[1],"w");
//定义字符数组用于存储输入数据
char buf[128]="";
scanf("%s",buf);
//将数组内的数据写入文件中
fwrite(buf,10,3,fp1);
//关闭文件
fclose(fp1);
//重新以只读形式打开文件
fp1=fopen(argv[1],"r");
//定义第二个文件用于作为复制
FILE* fp2=fopen(argv[2],"w");
//判断是否打开成功,失败输出错误信息
if(fp1==NULL)
{
perror("fopen");
return -1;
}
char rbuf[64]="";
//死循环确保完全复制
while(1)
{
//挨个字节读取文件1中的数据
int res=fread(rbuf,1,1,fp1);
//将读取到的数据写入文件2中
fwrite(rbuf,1,1,fp2);
//文件结束跳出死循环
if(res==0)
{
break;
}
}
//关闭文件
fclose(fp1);
fclose(fp2);
return 0;
}
运行结果:
被复制文件
复制文件
2.使用fgets获取当前文件的总行数
#include<myhead.h>
typedef struct sockaddr_in addr_in_t;
typedef struct sockaddr addr_t;
typedef struct sockaddr_un addr_un_t;
int main(int argc, const char *argv[])
{
//定义指针打开文件
FILE* fp=fopen("./hw2.c","r");
//判断文件是否打开成功,失败输出错误信息
if(fp==NULL)
{
perror("fopen");
return -1;
}
//计算行数
int count=0;
while(1)
{
//定义一个足够大的字符串数组确保文件每一行不会超过数组容量
char buf[128]="";
//fgets遇到回车结束读取
char* res = fgets(buf,128,fp);
//读取到文件结束符跳出循环
if(res==NULL)
{
break;
}
//没有遇到文件结束符则count+1
if(buf[strlen(buf)-1]=='\n')
count++;
}
printf("该文件行数为:%d\n",count);
return 0;
}
运行结果:
3.向文件中每一秒打印系统时间
#include<myhead.h>
typedef struct sockaddr_in addr_in_t;
typedef struct sockaddr addr_t;
typedef struct sockaddr_un addr_un_t;
//统计行数的函数
int line(FILE* fp)
{
int len=0;
fp=fopen("./hw3.txt","r");
if(fp==NULL)
{
perror("fopen");
return -1;
}
while(1)
{
//读取文件中的换行符
int ch=fgetc(fp);
if(ch=='\n')
{
len++;
}
if(ch==EOF)
{
break;
}
}
fclose(fp);
//将得到的行数以返回值的形式返回
return len;
}
int main(int argc, const char *argv[])
{
time_t sys_time = 0;
time_t last_sys_time=0;
//获取一次系统当前时间
time(&sys_time);
FILE* fp = fopen("./hw3.txt","a+");
//将得到的文件行数赋值给num
int num=line(fp);
while(1)
{
//再次获取系统时间
time(&last_sys_time);
//当第一次获取的系统时间和第二次不相等时执行下列语句
if(sys_time!=last_sys_time)
{
//将再次获取的系统时间赋值给第一次获取系统时间的变量
sys_time=last_sys_time;
//调用localtime函数,将当前时间赋值给localTime结构体
struct tm *localTime;
localTime = localtime(&sys_time);
//将时间转化为格式串打印到终端
printf("%02d:%4d年-%02d月-%02d日 %02d时:%02d分:%02d秒\n",num+1,
localTime->tm_year+1900,localTime->tm_mon+1,
localTime->tm_mday,localTime->tm_hour,
localTime->tm_min,localTime->tm_sec);
//手动刷新缓冲区
fflush(stdout);
//将时间输出到文件中
fprintf(fp,"%02d:%4d年-%02d月-%02d日 %02d时:%02d分:%02d秒\n",num+1,
localTime->tm_year+1900,localTime->tm_mon+1,
localTime->tm_mday,localTime->tm_hour,
localTime->tm_min,localTime->tm_sec);
//行数自增
num++;
//刷新缓冲区
fflush(fp);
}
}
fclose(fp);
return 0;
}
运行结果: