初步编码效果:文件未实现大小完全相同,有bug
#include<stdio.h>
#include<errno.h>
#define MSG(msg) {printf("--%d--",__LINE__);perror(msg);}
int main(int argc, const char *argv[])
{
//fwrite和fread实现文件拷贝
FILE* fp=fopen("./fgets.c","r");
FILE* fc=fopen("./cpgets.c","w+");
if(NULL==fp)
{
MSG("fopen");
return -1;
}
//读取然后写入,先定义缓存区
char arr[10]={0};
int index=0;
while(!feof(fp))
{
fread(arr,sizeof(arr),1,fp);
fwrite(arr,sizeof(arr),1,fc);
index++;
}
printf("%d\n",index);
if(fclose(fp)<0||fclose(fc)<0)
{
MSG("fcolse");
return -1;
}
return 0;
}
问题解决:深刻理解fread函数的使用;返回值的意义
成功,返回输出的数据个数,
size_t nmemb
;
失败或者读取到文件结尾,返回小于
nmemb
或者是
0
;
fread读到几个数据,就会返回数据的个数,当最后不满足参数里的数据个数,也会发返回读到的数据个数;所以在写入是可以跟读到的返回值同步
#include<stdio.h>
#include<errno.h>
#define MSG(msg) {printf("--%d--",__LINE__);perror(msg);}
int main(int argc, const char *argv[])
{
//fwrite和fread实现文件拷贝
FILE* fp=fopen("./fgets.c","r");
FILE* fc=fopen("./cpgets.c","w+");
if(NULL==fp)
{
MSG("fopen");
return -1;
}
//读取然后写入,先定义缓存区
char arr[10]={0};
int index=0;
size_t res=0; //返回值类型size_t
while(1)
{
res=fread(arr,1,sizeof(arr),fp);
//每个数据大小1,一次读取整个数组的大小;
//返回读取的数据个数
if(res==0)
{
break;
}
fwrite(arr,1,res,fc);
//读到几个数据,就写几个
index++;
}
printf("拷贝成功,读写%d次\n",index);
if(fclose(fp)<0||fclose(fc)<0)
{
MSG("fcolse");
return -1;
}
return 0;
}
fgets实现统计行数
#include<stdio.h>
#include<string.h>
#define MSG(msg) {printf("--%d--",__LINE__);perror(msg);}
int count_line(FILE* fp)
{
char arr[30]="0";
int line = 0;
while(NULL != fgets(arr,sizeof(arr),fp))
{
//fgets遇到\n结束,会按行放到数组arr中,并在/n的后边补/0
// /n的位置是字符串长度减1
if(arr[strlen(arr)-1] == '\n')
{
line++;
}
}
return line;
}
int main(int argc, const char *argv[])
{
FILE* fp=fopen("1.txt","a+");
if(NULL==fp)
{
MSG("fopen");
return -1;
}
int line=count_line(fp);
printf("line=%d\n",line);
if(fclose(fp)<0)
{
MSG("fclose");
return -1;
}
return 0;
}