2010-04-01 25 views
11

我需要打開一個文件作爲ofstream並寫入文件的前面,同時保留 文件的其餘內容,這些內容將被「移動」。類似於「prepend」 的一個文件。C++寫到文件的前面

這可能使用STL或提升?

回答

5

不,它不是。之前這已經被多次詢問過了。如果你想這樣做,你必須創建一個新文件,寫入「前置」數據,然後打開現有文件並將其內容複製到新文件中。

16

否 - 語言(或圖書館)在這裏並沒有太大的區別。大多數文件系統都不允許,完全停止。

獲得相同效果的常用方法是將新數據寫入新文件,然後將舊文件中的數據複製到新文件中,以遵循所寫的數據。

+0

你怎麼能說這是不可能的,然後描述如何做到這一點?加速提供便攜式文件系統庫http://www.boost.org/doc/libs/1_42_0/libs/filesystem/doc/index.htm用'的boost :: remove'這的確實際上有所作爲,如果要取消舊文件並創建一個新文件 - 並非如此,或者甚至是一種實現它的好方法。 OP沒有要求一個班輪,他尋求幫助。 – Potatoswatter 2010-04-02 01:27:15

+6

他沒有描述如何去做;他描述了這個問題的標準解決方法。 – Nate 2010-04-02 05:05:07

+0

呃,作爲一種解決方法意味着完成任務。更重要的是,我們使用C++是因爲它是可移植的,而語言和庫*會做出改變,因爲使用了特定的特性來解決問題。看到我的答案。 – Potatoswatter 2010-04-02 13:27:56

1

新的iostream類可以包裝該功能。這假定您的預先數據不會太大,以致無法舒適地適應內存。像經常使用它ofstream

#include <fstream> 
#include <sstream> 
#include <vector> 

class prepend_ofstream 
    : public std::ostringstream { 
    std::filebuf file; 
public: 
    prepend_ofstream() {} 
    prepend_ofstream(char const *name, openmode mode = out) { 
     open(name, mode); 
    } 
    ~prepend_ofstream() { 
     if (is_open()) close(); 
    } 
    void open(char const *name, openmode mode) { 
     if (! file.open(name, mode & binary | in | out)) { 
      setstate(failbit); 
     } 
    } 
    bool is_open() { return file.is_open(); } 
    void close() { 
     if (! is_open()) { 
      setstate(failbit); 
      return; 
     } 
     char *strbuf = &str()[0]; 
     std::vector<char> buf(str().size()); 
     int rdsz; 
     do { 
      rdsz = file.sgetn(&buf[0], buf.size()); 
      file.pubseekoff(-rdsz, cur); 
      file.sputn(strbuf, buf.size()); 
      file.pubseekoff(0, cur); // "update the output sequence" 
      std::copy(&buf[0], &buf[0]+rdsz, strbuf); 
     } while (rdsz == buf.size()); 
     file.sputn(&buf[0], rdsz); 
     if (! file.close()) { 
      setstate(failbit); 
     } 
    } 
}; 

通常功能是通過新的流加到緩衝器類,而不是實際的流,但在這種情況下,新的功能是在close,這是不幸的是沒有虛擬的。