1

ofstream ポインターへの書き込みに問題があります。もう欠落しているものは何もないので、これは非常に困惑しています。注、これはこの質問のフォローアップです: C++ vector of ofstream, how to write to one specific element

私のコードは次のとおりです。

std::vector<shared_ptr<ofstream>> filelist;

void main()
{
  for(int ii=0;ii<10;ii++)
  {
     string filename = "/dev/shm/table_"+int2string(ii)+".csv";
     filelist.push_back(make_shared<ofstream>(filename.c_str()));
  }

  *filelist[5]<<"some string"<<endl;
  filelist[5]->flush();
  exit(1);

}

これは出力ファイルに何も書き込みませんが、10 個の空のファイルを作成します。ここで何が間違っている可能性があるか知っている人はいますか?

編集:さらにいくつかのテストを実行しました。すべてのコールバックが終了するまで、すべてのファイルに対して、完了するまで exit(1) なしでコードを実行します。一部のファイルは空ではありませんが、データが必要な他のファイルは空です。

十分なディスク容量があり、必要以上のファイル記述子があることはわかっています。一部のファイルが正しく書き込まれ、他のファイルが正しく書き込まれない理由についての説明はありますか?

4

2 に答える 2

2

私は試してみます: (*filelist[5])<<"some string\n";.

ただし、おそらくループ内のファイルに書き込むつもりだったと思います-そのままでは、1つのファイルにのみ書き込みます。

ああ、C++ では、exit.

編集:これは簡単な(テスト済みの)スタンドアロンデモです:

#include <fstream>
#include <string>
#include <vector>

std::vector<std::ofstream *> filelist;

int main() {
  for(int ii=0;ii<3;ii++)
  {
    char *names[] = {"one", "two", "three"};
     std::string filename = "c:\\trash_";
     filename += names[ii];
     filename += ".txt";
     filelist.push_back(new std::ofstream(filename.c_str()));
  }

  for (int i=0; i<filelist.size(); i++) {
    (*filelist[i])<<"some string\n";
    filelist[i]->close();
  }
}

ただし、これが生成するファイル名は Windows 用であることに注意してください。一方、オリジナルは (明らかに) Unix のようなものを対象としていました。Unix ライクな OS の場合、別のファイル名文字列が必要になります。

于 2013-04-01T18:23:53.940 に答える