在未知文件长度的 情况下,对文件进行读写,要作好文件读写结束的判断。
但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;
}