我試圖追加一些數據到一個文件,但在某些情況下想從最後跳過一點來覆蓋文件的尾部。但是,seekp(pos)
和seekp(offset, relative)
都不會對我有任何影響(除了使用負偏移量時抱怨)。我是不正確地使用它們還是破碎?如何恢復將數據附加到特定位置的文件? (std :: ostream,streampos,tellp/seekp)
下面是一個小例子。編譯: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
。在這種情況下,追加工作,但試圖尋找一個負/偏移不起作用,因爲(來自gcc doc):
ios :: app在每次寫入前尋找文件結尾。
我還試圖既不使用也不ios::ate
ios::app
(大概截斷模式),作爲ios::ate
相同的效果。
對不起,如果這看起來像一個錯誤報告,但我想檢查是否有什麼我在這裏有錯誤在這裏使用seekp
,並瞭解它是否是編譯器特定的。
我不是這方面的專家,但嘗試使用std :: fstream而不是ofstream並在打開文件時使用std :: ios :: in;我知道一些文件流的內部,我認爲這可能會幫助 – Tomaka17 2010-07-21 10:52:57
Bril,謝謝!任何想法,如果這是一個gcc只或共同的東西?我會嘗試儘快測試至少MSVC,但沒有安裝在這裏... – dhardy 2010-07-22 09:10:52