7

を使用して多くのファイルI/Oを実行する一部のコードでは、std::ofstream効率を上げるためにストリームをキャッシュしています。ただし、ファイルのオープンモードを変更する必要がある場合があります(たとえば、追加と切り捨て)。同様のモックコードを次に示します。

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必要な場合にのみ閉じて再度開くことができるようにする方法はありますか?
4

1 に答える 1

4

@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
};
于 2012-11-21T18:55:33.717 に答える