当前位置: 首页 > 工具软件 > FE > 使用案例 >

feof的使用

单勇
2023-12-01


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

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


 类似资料: