zhangJW_cn 阅读(1641) 评论(5)
将以下代码的注释分别代码打开和关闭,在不同系统上运行,查看结果。

#include
#include


int main( int argc,char *argv[] )
{
FILE *fp = fopen( "a.txt","ab" );
// fseek( fp,0,SEEK_END );
long pos1 = ftell( fp );
fwrite( "abc",3,1,fp );
long pos2 = ftell( fp );
fclose( fp );
std::cout << pos1 << "," << pos2 << std::endl;

return 0;
}

windows上vs2005和MinGW 3.2.3关闭注释时,结果不符合预期,多次运行始终返回0;打开注释后结果符合预期;采用centos 5.7 和其自带的缺省gcc,打开和关闭注释,两者结果一致,均符合预期。



评论列表
周星星
re: 特定条件下,ftell返回值错误
我用mingw 4.5.2,结果是正确的,分别是
0,3 0,6 0,9
即使在fwrite之前加上fseek( fp,1,SEEK_SET )后,fwrite( "abc",3,1,fp )依然是追加到文件尾部,而非fseek到的第1字节处。我记得这种行为才是符合标准的,fopen以p(追加)方式打开,能保证所有进程都从文件尾部追加数据,从而保证数据不会错乱(也就是fwrite之前保证fseek到尾部,这一点必须从库上实现,个人做不了)。我这里现在没有VC,没法测试,我记得以前的VC是不行的。
周星星
re: 特定条件下,ftell返回值错误
在一台安装有VC9的机器上测试了一下,结果正确,行为和mingw4.5.2一致
清风雨
re: 周星星
在windows上我运行得到的结果也是“0,3,0,6,0,9”;
在centos 5.7 上运行得到的结果却是“0,3,3,6,6,9”;
当注释内容打开(即执行先fseek到文件尾),结果同linux。
linux的结果更符合我的预期(更简单、易于理解),没去研究相关的标准定义。

“即使在fwrite之前加上fseek( fp,1,SEEK_SET )后,fwrite( "abc",3,1,fp )依然是追加到文件尾部”,会让我觉得匪夷所思,不过如果标准这么定义的,那应该是我错误理解 —— 即标准偏向“ab”定义为只能追加,不能改写?而我理解为“ab”只是定义为初始fseek到文件尾部追加,依然fseek可以改写原内容。
wifecooky
re: 特定条件下,ftell返回值错误
以r+b方式打开就没问题

发表评论
切换编辑模式