2012-11-21 56 views
3

在一些使用std::ofstream執行大量文件I/O的代碼中,我正在緩存流以提高效率。但是,有時我需要更改文件的openmode(例如append vs truncate)。下面是一些類似的模擬代碼:更改或檢查std :: ofstream的openmode

class Logger { 
public: 
    void write(const std::string& str, std::ios_base::openmode mode) { 
     if (!myStream.is_open) myStream.open(path.c_str(), mode); 
     /* Want: if (myStream.mode != mode) { 
        myStream.close(); 
        myStream.open(path.c_str(), mode); 
       } 
     */ 
     myStream << str; 
    } 
private: 
    std::ofstream myStream; 
    std::string path = "/foo/bar/baz"; 
} 

有誰知道:

  • 有一種方法來改變ofstream的用於openmode?
  • 如果不是,有沒有辦法找出ofstream的當前openmode是什麼,所以我只能在必要時關閉並重新打開它?
+0

你可能想了解(這些)(http://en.cppreference.com/w/cpp/io/basic_ofstream)狀態的功能,允許您設置或國旗迴歸..... – Recker

+0

我只是好奇你爲什麼要改變它?什麼時候適用這樣的條件? –

+0

@noleptr我看着這些,但他們不讓你改變文件的開放模式。你只能得到/設置'goodbit','badbit','failbit','eofbit'。 @BartekBanachewicz我正在重做庫的一部分的實現。我不確定在什麼情況下你確實需要這個,但我需要保持和以前一樣的行爲。以前,這是通過特定於平臺的系統調用來完成的,它可以讓您查詢文件的狀態。 – Ari

回答

2

@Ari由於默認實現不允許您想要的待辦事項,因此您可能需要封裝ofstream並提供額外的get/set打開模式功能,其中您的新對象將模擬所需的行爲。

也許像這樣

class FileOutput{ 
    private: 
    ostream& streamOut; 
    std::ios_base::openmode currentOpemMode; 
    public: 
    FileOutput(ostream& out, std::ios_base::openmode mode) 
    : streamOut(out), currentOpemMode(mode){} 

    void setOpenMode(const std::ios_base::openmode newOpenMode){ 
      if(newOpenMode != currentOpemMode){ 
       currentOpemMode = newOpenMode; 
       updateUsedMode(); 
      } 
    } 
    private: 
    void updateUsedMode(){ 
      if(currentOpemMode == ios_base::app){ /* use seekg/tellg to move pointer to end of file */} 
      else if(currentOpenMode == binary){ /* close stream and reopen in binary mode*/} 
     //...and so on 
};