APUE复习--标准I/O操作(1)

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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值