关于fread后二进制文件指针及空文件/单结构体文件的疑问
文件指针与fread/feof相关问题解答
示例代码
void main() { FILE *cfPtr; /* credit.dat file pointer */ /* create clientData with default information */ struct clientData client = { 0, "", "", 0.0 }; if ( ( cfPtr = fopen( "credit.dat", "rb" ) ) == NULL ) printf( "File could not be opened.\n" ); else { printf( "%-6s%-16s%-11s%10s\n", "Acct", "Last Name", "First Name", "Balance" ); /* read all records from file (until eof) */ fread( &client, sizeof( struct clientData ), 1, cfPtr ); while ( !feof( cfPtr ) ) { /* display record */ if ( client.acctNum != 0 ) printf( "%-6d%-16s%-11s%10.2f\n", client.acctNum, client.lastName, client.firstName, client.balance ); fread( &client, sizeof( struct clientData ), 1, cfPtr ); } /* end while */ fclose( cfPtr ); /* fclose closes the file */ } /* end else */ } /* end main */
问题解答
问题1:若文件为空,struct client的内容是什么?
当文件为空时,第一次调用fread会读取失败(返回0),此时client的内容会保持初始化时的默认值:acctNum为0,lastName和firstName是空字符串,balance为0.0。因为fread读取失败时不会修改目标内存的原有内容。问题2:若文件仅包含一个结构体,调用fread后文件指针会移动到结构体之后(即EOF位置),此时feof判断是否会为假导致该结构体无法被打印?
不会,结构体可以正常打印,流程如下:- 第一次
fread成功读取到结构体,文件指针移动到EOF位置,但此时feof(cfPtr)不会返回真——feof的标志位只有在尝试读取越过EOF边界时才会被设置。 - 进入
while (!feof(cfPtr))循环,此时feof标志未触发,条件为真,执行循环体打印该结构体(因为acctNum不为0)。 - 循环内再次调用
fread,这次尝试读取越过EOF,fread返回0,同时设置feof标志位。 - 下一次循环判断
!feof(cfPtr)时条件为假,退出循环。
- 第一次
内容的提问来源于stack exchange,提问作者omri
相关产品推荐
相关产品推荐

