1-复制文件(fopen,fclose,fgetc,fpuc)
/*
标准io实现一个复制文件的小case
打开一个文件(fopen),通过返回值获取其中的内容,然后使用fgetc和fputc
两个函数,将读取的文件流写入到另外一个流中。
注意:在windows平台二进制文件需要加上b(bin)模式。
另此程序案例将绝对路径写死,也可以通过argv[1],来指定路径
同样也可以使用fgets和fpus函数,不同在于,这两个函数进行字符串操作,可以一次读取写入多个指定数量的字符
注意:fgets如果读取到文件末尾或错误,其返回值则为NULL,这点与fgets的EOF不同
下面列入两个函数原型:
char *fgets(char *s, int size, FILE *stream);
*s:读取文件的存放地址,一般会定义一个字符数组来传参
size:一次读取字符大小
*stream: 需要从哪里读取
int fputs(const char *s, FILE *stream);
*s:传入fgets中定义接受的字符数组
*stream:写入到哪个文件流中
*/
#include<stdlib.h>
#include<stdio.h>
#define PATHNAME1 "/home/kali/code/1.txt"
#define PATHNAME2 "/home/kali/code/2.txt"
int main(int argc, char const *argv[])
{
FILE *fps,*fpd;
int ch;
fps=fopen(PATHNAME1 ,"r");//打开文件
if (fps==nullptr)
{
perror("fopen1 error");
}
fpd=fopen(PATHNAME2 ,"w");//写文件
if (fpd==nullptr)
{
perror("fopen2 error");
}
while (1)
{
ch=fgetc(fps); //从流中获取文件数据,
if (ch==EOF)
break;
fputc(ch,fpd); //将获取的流返回值ch中的数据,写入到另外一个流中
}
fclose(fpd);//有打开就要有关闭
fclose(fps);
return 0;
}
2-字符统计
/*
利用fgetc函数读取字符末尾返回EOF的特性,
可以使用此函数写一个字符统计的小程序
*/
#include<stdlib.h>
#include<stdio.h>
#define PATHNAME "/home/kali/code/1.txt"
int main(int argc, char const *argv[])
{
FILE *fps;
int count=0;
fps=fopen(PATHNAME ,"r");//打开文件
if (fps==nullptr)
{
perror("fopen1 error");
}
while (fgetc(fps)!=EOF)//到达文件末尾返回EOF
{
count++; //统计的字符个数
}
printf("%d\n",count); //输出字符个数
return 0;
}
3-文件偏移操作(fseek,ftell)
/*
fseek 设置文件偏移量
ftell 查看当前文件偏移量
可以使用这两个函数组合,来进行字符统计,代码会更加简洁
*/
#include<stdlib.h>
#include<stdio.h>
#define PATHNAME "/home/kali/code/1.txt"
int main(int argc, char const *argv[])
{
auto fp=fopen(PATHNAME,"r");
if (fp==NULL)
{
perror("open error");
}
fseek(fp,0,SEEK_END); //设置文件偏移到尾部
printf("%d\n",ftell(fp));//查看当前文件偏移位置
return 0;
}