Я пытаюсь добавить некоторые данные в файл, но в некоторых случаях хочу немного отскочить от конца, чтобы перезаписать конец файла.Тем не менее, ни 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
и получить представление о том, зависит ли это от компилятора.