IO编程--拷贝文件、文件总行数输出、时间打印

一、使用fread和fwrite完成两个文件的拷贝,要求源文件和目标文件由外界输入

代码如下:

#include <myhead.h>
int main(int argc, const char *argv[])
{
    //判断是否输入两个文件名
	if(argc!=3)
	{
		fprintf(stderr,"文件个数错误");
		return -1;
	}
    //以读形式打开文件
	FILE *fp=fopen(argv[1],"r");
	//以写形式打开文件
    FILE *fq=fopen(argv[2],"w");
    //判断文件是否成功打开
    if(fp==NULL||fq==NULL)
    {
        perror("fopen error");
        return -1;
    }
    //定义字符串数组
	char str[50];
    //循环将一个文件内容写入另一个文件
	while(1){
    //调用fread函数,成功返回值为项数,失败返回非项数
    //一个字节一个字节的读取文件,项数为字符串长度-1
	int res=fread(str,sizeof(char),sizeof(str)-1,fp);
	//字符串最后一个位置手动存放空格
    str[res]='\0';
    //如果读取失败跳出循环
	if(res<=0)
		break;
    //写入新文件
	fwrite(str,sizeof(char),res,fq);
	}
	fclose(fp);
	fclose(fq);
	return 0;
}

运行结果如图所示:

 diff指令是比较两个文件是否相等 失败返回不相等的内容;

二、使用fgets获取当前文件的总行数

代码如下:

#include <myhead.h>
int main(int argc, const char *argv[])
{
	FILE* fp=fopen(argv[1],"r");
	if(fp==NULL)
	{
		perror("fopen error");
		return -1;
	}
    //字符串数组长度足够大 使n只统计换行个数
	char str[1024];
	int n=0;
	while(1){
        //接受fgets函数返回值
		char *res=fgets(str,sizeof(str),fp);
		//如果返回值为null,读取完毕
        if(res==NULL){
			printf("读取完毕,该文件共有%d行\n",n);
			break;
		}
        //行数加1
		n++;
	}
	fclose(fp);
	return 0;
}

运行结果如图所示:

三、向文件中每一秒打印当前系统时间

代码如下:

#include <myhead.h>
#include <time.h>
//获取文件总行数
int count_line(int n)
{
	FILE* fq=fopen("time.txt","r");
	char ch=0;
	while(1)
	{
        //通过fgetc函数获取文件每个字符
		ch=fgetc(fq);
		if(ch==EOF)
			break;
		//如果字符是空格行数加一
        if(ch==10)
			n++;
	}
	return n;
	fclose(fq);
}
int main(int argc, const char *argv[])
{
    //以追加的形式打开文件
	FILE* fp=fopen("time.txt","a+");
	//手动刷新缓存区
    fflush(fp);
	int n=1;
    //显示当前文件总行数
    //多次调用函数,都在文件结尾追加行数
	n=count_line(n);
	while(1){
    //调用时间函数,获取当前时间
	time_t sys_time=time(NULL);
    //转换获取时间的格式
	struct tm* curr_time=localtime(&sys_time);
	//文件写入当前时间
    fprintf(fp,"%d、%4d年%2d月%2d日 %2d:%2d:%2d\n",\
			n,curr_time->tm_year+1900,curr_time->tm_mon+1,\
			curr_time->tm_mday,curr_time->tm_hour,curr_time->tm_min,\
			curr_time->tm_sec);
    //刷新缓存区,立即将时间写入文件
	fflush(fp);
    //行数加1
	n++;
    //等待1秒
	sleep(1);
	}
    fclose(fp);
	return 0;
}

运行结果如图所示:

四、思维导图

 

上一篇:前端布局与响应式设计综合指南(三)


下一篇:ABP VNext 系列:框架启动流程以及依赖注入原理和源码分析