4

プロジェクトでテキストを書き込むために 41 個の出力ファイルを使用したいと考えています。最初にこれらの出力ファイルに名前を付ける文字列配列listを作成してから、ストリームオブジェクトの配列を定義して名前を付けようとしましlistたが、このエラーが発生し'outfile' cannot be used as a functionます. 以下は私のコードです:

#include <sstream>
#include <string>
#include <iostream>
#include <fstream>
using namespace std ;
int main ()
{
  string list [41];
  int i=1;
  ofstream *outFile = new ofstream [41];

  for (i=1;i<=41 ;i++)
  {
    stringstream sstm;
    sstm << "subnode" << i;
    list[i] = sstm.str();
  }

  for (i=0;i<=41;i++)
    outFile[i] (list[i].c_str());

  i=1;
  for (i=1;i<=41;i++)
    cout << list[i] << endl;

  return 0; 
}
4

2 に答える 2

7

以下の修正については、以下を参照してください。

  1. 必要がない限り使用しnewないでください (すべてのファイルをリークしており、それらを適切に破棄しないとデータが失われます。適切に閉じないと、ストリームのフラッシュが行われず、保留中の出力バッファーが失われます)
  2. 適切な配列インデックスを使用する (0 から開始!)
  3. ファイルを開くためにデフォルトで構築.open(...)されたものを呼び出す ofstream
  4. 推奨事項:
    • 反対することをお勧めしusing namespace std;ます(以下は変更されていません)
    • を再利用することをお勧めしstringstreamます。これは良い習慣です
    • C++ スタイルのループ インデックス変数 ( for (int i = ....) を使用することをお勧めします。これにより、驚きiが過剰な範囲を持つことを防ぎます。
    • 実際には、時代に合わせて、さまざまな用途に使用してください。


#include <sstream>
#include <string>
#include <iostream>
#include <fstream>
using namespace std;
int main ()
{
    ofstream outFile[41];

    stringstream sstm;
    for (int i=0;i<41 ;i++)
    {
        sstm.str("");
        sstm << "subnode" << i;
        outFile[i].open(sstm.str());
    }

    for (auto& o:outFile)
        cout << std::boolalpha << o.good() << endl;
}
于 2012-10-11T08:57:33.090 に答える
1

コンストラクターを呼び出すことはできません。に電話してみてくださいoutFile[i].open(list[i].c_str())。「開く」に注意してください。

于 2012-10-11T08:42:47.797 に答える