feof的使用


在未知文件长度的 情况下,对文件进行读写,要作好文件读写结束的判断。

但feof()有点小毛病,特点:先读,根据读的结果来置位标志位,然后依据标志位来判断是否结束,

故有如下三种写法:

第一种写法,会读到标志位,不应采取,新手,容易范的错误。

第二种写法,可行,但是循环写的不够漂亮。

第三种写法, 应该作为标准写法来推行。


/*
 *方案一:先判断,后读取
 */
while (!feof(fp)) {
	fread(buf, 1, 100, fp);
	//do_some_thing
}
/*
 *方案二:先循环外读取,后判断
 */
fread(buf, 1, 100, fp);
while (!feof(fp)) {
	//do_some_thing
	fread(buf, 1, 100, fp);
}
/*
 *方案三:外读取,后判断
 */
while (1) {
	fread(buf, 1, 100, fp);
	if(feof(fp))
	break;
	//do_some_thing
}



附:读一字符,读一行,经测均可行。

int main()
{
	FILE * fp = fopen("abc.txt","r");

	while(1)
	{
		char c = fgetc(fp);
		if(feof(fp))
			break;
		printf("%c",c);
	}
	return 0;
}

typedef struct stu
{
	int id;
	char sex;
	char name[30];
}Stu;

int main() {
	FILE * fp = fopen("abc.txt", "w");

	Stu stu[4] = {{1,'s',"bob"},{2,'c',"alan"},{3,'c',"Tom"},{4,'r',"jim"}};
	fwrite(stu,sizeof(stu),1,fp);

	fclose(fp);

	Stu one;
	FILE * fp2 = fopen("abc.txt", "r");


	while(1)
	{
		fread(&one,sizeof(Stu),1,fp2);
		if(feof(fp))
			break;
		printf("%d-%c-%s\n",one.id,one.sex,one.name);
	}
	fclose(fp2);
	return 0;
}


对于读一行,在读到最后一行的时候,即己经置位,

可采用如下方案

int main()
{
	FILE * fp = fopen("abc.txt","r");

	char buf[1024];
	while(1)
	{
		fgets(buf,1024,fp);
		printf("%s",buf);
		if(feof(fp))
			break;
	}
	return 0;
}


或直接

int main()
{
	FILE * fp = fopen("abc.txt","r");

	char buf[1024];
	while(!feof(fp))
	{
		fgets(buf,1024,fp);
		printf("%s",buf);
	}
	return 0;
}

或者:

int main()
{
	FILE * fp = fopen("abc.txt","r");

	char buf[1024];
	while(fgets(buf,1024,fp)!=NULL)
	{
		printf("%s",buf);
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

developer_wgl

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值