2010-07-21 38 views
3

我試圖追加一些數據到一個文件,但在某些情況下想從最後跳過一點來覆蓋文件的尾部。但是,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::ateios::app(大概截斷模式),作爲ios::ate相同的效果。

對不起,如果這看起來像一個錯誤報告,但我想檢查是否有什麼我在這裏有錯誤在這裏使用seekp,並瞭解它是否是編譯器特定的。

+0

我不是這方面的專家,但嘗試使用std :: fstream而不是ofstream並在打開文件時使用std :: ios :: in;我知道一些文件流的內部,我認爲這可能會幫助 – Tomaka17 2010-07-21 10:52:57

+0

Bril,謝謝!任何想法,如果這是一個gcc只或共同的東西?我會嘗試儘快測試至少MSVC,但沒有安裝在這裏... – dhardy 2010-07-22 09:10:52

回答

3

您需要打開具有輸入和輸出屬性的文件。
下面的代碼沒有通常的錯誤處理,它只是爲了說明一種技術。

#include <iostream> 
#include <fstream> 

int main() 
{ 
    const char *szFname = "c:\\tmp\\tmp.txt"; 
    std::fstream fs(szFname, 
        std::fstream::binary | 
        std::fstream::in  | 
        std::fstream::out); 
    fs.seekp(13, std::fstream::beg); 
    fs << "123456789"; 

    return 0; 
} 

=========================================== =====

C:\Dvl\Tmp>type c:\tmp\tmp.txt 
abdcefghijklmnopqrstuvwxyz 
C:\Dvl\Tmp>Test.exe 
C:\Dvl\Tmp>type c:\tmp\tmp.txt 
abdcefghijklm123456789wxyz 
C:\Dvl\Tmp> 
+0

謝謝。這實際上與Tomaka17已經給出的答案相同! – dhardy 2010-08-02 07:38:13

相關問題