我正在尝试将一些数据附加到文件中,但在某些情况下,我想从末尾向后跳一点以覆盖文件的尾端。但是,对我seekp( pos )
也没有seekp( offset, relative )
任何影响(除了在使用负偏移量时抱怨)。我是在错误地使用它们还是它们坏了?
下面是一个小例子。编译器:gcc 4.4.4 版(Debian 4.4.4-6)
#include <fstream>
#include <sstream>
#include <boost/date_time/posix_time/posix_time.hpp>
using namespace std;
using namespace boost::posix_time;
int main(int nargs, char** pargs){
if( nargs < 2 || nargs > 3 ){
cerr<<"Usage: "<<pargs[0]<<" file [pos]"<<endl;
return 1;
}
const char* fname = pargs[1];
ofstream f( fname, ios::binary|ios::out|ios::ate );
if( !f.good() ){
cerr<<"Unable to open file!"<<endl;
return 1;
}
if( nargs == 3 ){
istringstream offss(pargs[2]);
streamoff off;
offss >> off;
cout <<"Seeking to: "<<off<<endl;
f.seekp( off, ios_base::end ); // using beg or cur instead doesn't help, nor does: seekp( off )
if( f.fail() ){
cerr<<"Unable to seek!"<<endl;
f.clear(); // clear error flags
}
}
f<<"[appending some data at "<<second_clock::local_time()<<"]\n";
return 0;
}
现在,如果我使用 0 偏移量,它应该将输出位置放在文件的末尾并且写入应该追加,对吗?好吧,它对我没有影响(osf 以前不是空的):
> ./ostream_app_pos osf 0
Seeking to: 0
> cat osf
[appending some data at 2010-Jul-21 11:16:16]
通常的追加方式是使用ios::app
. 在这种情况下,追加有效,但尝试使用 neg/pos 偏移量没有效果,因为(来自 gcc doc):
ios::app 在每次写入之前查找文件末尾。
我也尝试使用既不ios::ate
也不ios::app
(可能是截断模式),效果与ios::ate
.
抱歉,如果这读起来很像错误报告,但我想检查一下我在使用中是否有问题,seekp
并了解它是否是特定于编译器的。