5

これが私の問題です。X個のファイルを作成し、さまざまな事実に応じてそれらに書き込む必要があります。私の解決策は、このようなオブストリームポインターのベクトルを作成することでした

#include <boost/algorithm/string.hpp>
#include <vector>
#include<string>
#include <iostream>
#include <fstream>
vector<ofstream*> files;
files.resize(SplitVec.size()-4);
          for(i=0;i<SplitVec.size()-4;i++)
          {
              line="/Users/jorge/Desktop/testing/strain_"+lexical_cast<string>(i);
              cout<<"ine"<<endl;
              files[i]=new ofstream(line.c_str());
          }

この部分までは素晴らしいファイルを作成し、プログラムの後半でそれらに書き込みますが、これも素晴らしいことです。私の問題は、次を使用する場合、オブジェクトを閉じたいときです。

for(i=0;i<SplitVec.size()-4;i++)
          {
              *files[i].close();
          }

次のエラーが表示されます。

In file included from main.cpp:14:./methyl.h:298: error: request for member 'close' in 'files. std::vector<_Tp, _Alloc>::operator[] [with _Tp = std::ofstream*, _Alloc = std::allocator<std::ofstream*>](1ul)', which is of non-class type 'std::ofstream*'

それで、私は質問があります.1つ目は、なぜcloseを呼び出すことができないのかということです.これはストリームへのポインタです.プログラムは正常に動作しますが、これは悪い習慣であり、怠け者またはくだらないプログラマーになりたくないことはほぼ確実です。私はできる限り調べましたが、答えを見つけることができませんでした. ありがとうございました!!!

4

2 に答える 2

9

使用する

(*files[i]).close();

または直接

files[i]->close();
于 2012-09-20T09:32:56.853 に答える
5

コードは例外に対して安全ではありません (たとえば、例外がスローされた場合、生のポインターのベクトルがあるため、関連するストリーム ハンドルと共にリークされます)。

最新の C++ RAII アプローチをお勧めします。

たとえば、shared_ptr(Boost または C++11<memory>ヘッダーから) のようなスマート ポインターを使用する場合、 vectorof を作成し、オブジェクトの割り当てにshared_ptr使用できます。make_sharedofstream

// RAII exception-safe approach
vector<shared_ptr<ofstream>> files;

// Add a new ofstream object to the vector:
files.push_back( make_shared<ofstream>( filename ) );

ベクトルがスコープ外になると破棄され、指定されたすべてのストリーム オブジェクトが自動的に解放されます。非常にシンプルで明確で、例外セーフです。

ベクトルが範囲外になる前にストリームのクリーンアップを強制したい場合は.clear()、ベクトルでメソッドを呼び出すだけです。

(代わりに、C++11 move-semantics -poweredunique_ptrを使用して を定義することもできますvector<unique_ptr<ofstream>>が、残念ながらmake_sharedforunique_ptrに相当する標準はなく、 のカスタム実装を記述しない限り、コードはもう少し冗長になる可能性がありますmake_uniqueHerb Sutter によって提案されたもの。)

このスマートポインターのベクトルの場合にも、通常のfiles[i]->close()構文が適用されることに注意してください。

于 2012-09-20T09:58:34.230 に答える