一、使用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; }
运行结果如图所示:
四、思维导图