使用fgets计算行数
#include <stdio.h>
#include <string.h>
#include <errno.h>
int main()
{
FILE *fp;
int n=0,count=0;
char Buf[1024];
if((fp=fopen("./file.txt","r"))==NULL) //打开文件
{
perror("open file");
return -1;
}
while((fgets(Buf,sizeof(Buf),fp))!=NULL) //使用fgets读取每行的内容放入数组
{ //fgets读到'\n'结束,结尾自动增加'\0'
n=strlen(Buf)-1; //n指向数组倒数第二个
if(Buf[n]=='\n') //统计'\n'的个数,获得行号
{
count++;
}
}
printf("文件共有%d行!\n",count); //输出行数
fclose(fp); //关闭文件
return 0;
}
使用fgets与fputs拷贝文件内容
方法1
#include <stdio.h>
#include <string.h>
#include <errno.h>
int main(int argc, const char *argv[])
{
FILE *fp,*fp1;
char Buf[1024],world;
if(argc!=3) //判断终端输入的字符串是否为三个
{
printf("file count error!\n");
printf("usge:./a.out fileName1 fileName2\n");
return -1;
}
if((fp=fopen(argv[1],"r+"))==NULL) //打开./a.out后面第一个字符串的文件名对应文件
{
perror("open file");
return -1;
}
if((fp1=fopen(argv[2],"w"))==NULL) //打开./a.out后面第二个字符串的文件名对应文件
{
perror("open file");
return -1;
}
while((fgets(Buf,sizeof(Buf),fp))!=NULL)//循环读第一个文件的每一行放入数组
{
fputs(Buf,fp1); //每读一行向第二个文件输入一行
}
fclose(fp);
fclose(fp1);
return 0;
}
方法2:利用指针偏移
#include <stdio.h>
#include <string.h>
#include <errno.h>
int main(int argc, const char *argv[])
{
FILE *fp,*fp1;
int n=0,count=0;
char Buf[1024],world;
char *p=Buf; //定义指针p指向数组Buf
if(argc!=3) //判断终端输入的字符串是否为三个
{
printf("file count error!\n");
printf("usge:./a.out fileName1 fileName2\n");
return -1;
}
if((fp=fopen(argv[1],"r+"))==NULL) //打开./a.out后面第一个字符串的文件名对应文件
{
perror("open file");
return -1;
}
if((fp1=fopen(argv[2],"w"))==NULL) //打开./a.out后面第二个字符串的文件名对应文件
{
perror("open file");
return -1;
}
while((fgets(p,sizeof(Buf),fp))!=NULL)//循环读第一个文件的每一行放入数组
{
n=strlen(Buf)-count; //n下次指针需要偏移的个数:当前字符串的长度减去之前字符串的长度
p=p+n; //指针p偏移次数为读取内容的个数
count=count+n; //累计本次结束后数组的总长度
}
//文件的所有内容已经完全存入数组中
printf("%d\n",count); //输出文件内容的总个数(包括'\n')
fputs(Buf,fp1); //一次性将数组存放第一个文件的所有内容输出到第二个文件
for(int i=0;i<count;i++) //在终端上打印文件的所有内容
{
printf("%c",Buf[i]);
}
printf("\n");
fclose(fp); //关闭两个文件
fclose(fp1);
return 0;
}