2012年(158)
分类: C/C++
2012-11-26 15:54:57
fstream的读写测试
这是一个简单的程序,将文件中的'i'转化为'I',其中最关键的一步是 seekp( 0, cur
),其目的是使得读和写重新协调起来。
test.txt中的内容是“1i2i3i4i5”
#include
#include
using namespace std;
int main( void )
{
fstream f( "C:\\test.txt",
ios_base::in|ios_base::out|ios_base::binary );
if( f )
{
for( char c; f.read(&c,1); )
{
if( c
== 'i' )
{
f.seekp( -1, ios_base::cur
);
f.write( "I", 1 );
f.seekp( 0, ios_base::cur );
}
}
f.close();
}
return 0;
}
使用 MinGW(gcc3.5.0) 测试,结果正确
使用 VC2008 测试,死循环
于是将 f.seekp( 0, ios_base::cur ) 改为 f.sync()或f.flush(),即代码变为
int main( void
)
{
fstream f( "C:\\test.txt",
ios_base::in|ios_base::out|ios_base::binary );
if( f )
{
for( char c; f.read(&c,1); )
{
if( c
== 'i' )
{
f.seekp( -1, ios_base::cur
);
f.write( "I", 1 );
f.flush(); //
和使用f.sync()效果一样
//
f.tellp();
}
}
f.close();
}
return 0;
}
使用 VC2008 测试,结果正确
使用 MinGW(gcc3.5.0)
测试,只有第一个i被修改成功。但如果再在其后增加一个没用的f.tellp()它却也能成功。
按ISO C99的说法:
When a file is opened with update mode ('+' as the second or
third character in the
above list of mode argument values), both input and
output may be performed on the
associated stream. However, output shall not
be directly followed by input without an
intervening call to the fflush
function or to a file positioning function (fseek,
fsetpos, or rewind), and
input shall not be directly followed by output without an
intervening call to
a file positioning function, unless the input operation encounters
end-
of-file.
但测试结果是:VC用flush没问题,mingw用seek没问题,也就是说都有问题