【发布时间】:2015-07-24 06:38:25
【问题描述】:
我想将文件读入缓冲区。我在fread() 遇到分段错误。看起来ftell() 会返回正确的尺寸。但后来事情出错了。 fseek()会修改f吗?为什么fread() 不起作用?
int pk_load_file( const char *filename )
{
FILE *f;
int size;
unsigned char *buf;
if( ( f = fopen( filename, "rb" ) ) == NULL )
return -1;
fseek( f, 0, SEEK_END );
if( ( size = ftell( f ) ) == -1 )
{
fclose( f );
return -2;
}
fseek( f, 0, SEEK_SET );
if( fread( buf, 1, size, f ) != size )
{
fclose( f );
return -3;
}
fclose( f );
return( 0 );
}
【问题讨论】:
-
不要使用
fseek()/ftell()来计算文件的大小,尤其是在二进制模式下。根据 C 标准 (open-std.org/jtc1/sc22/wg14/www/docs/n1124.pdf):“二进制流不需要有意义地支持 wherece 值为 SEEK_END 的 fseek 调用”。另请参阅:securecoding.cert.org/confluence/display/c/…
标签: c file-io segmentation-fault fread fseek