1

テキストファイルに書き込もうとしています。forループを使用しない場合は正常に書き込むことができますが、すべての配列をファイルに書き込むために実装すると、クラッシュします。これが私のコードです:

void writeFile(void)
{
  char *fileName[30];
  cout << "enter a filename";
  cin >> *fileName;
  ofstream myfile;
  myfile.open (*fileName);
  int p;

  for(p = 0; p <= i; p++)
    {
      myfile << right << setw(4) << setfill('0') << packet[i].getSource() <<  ":";
      myfile << right << setw(4) << setfill('0') << packet[i].getDest() <<  ":";
      myfile << right << setw(4) << setfill('0') << packet[i].getType() <<  ":";
      myfile << right << setw(4) << setfill('0') << packet[i].getPort() <<  endl;
    }

私が間違っているアイデアはありますか?

4

3 に答える 3

3

fileNamecharへの初期化されていない30個のポインタの配列です。は、charへの初期化されていないポインタであると*fileName同じです。filename[0]このポインタは、有効な値を割り当てる以外には使用できません。しかし、あなたはそれをしていません、そしてその代わりにあなたはそれにデータを読み込もうとしていて、予想通り壊滅的な結果をもたらします。

つまり、C ++でポインタを使用するのではなくstd::string、状況に応じてを使用する必要があります。

std::string fileName;
if (!(std::cin >> fileName)) { /* I/O error, die */ }
// ...

fileName(おそらく、30文字の配列を作成することを意図していました: char fileName[30];。しかし、そうしないでください。うまくいくかもしれませんが、それは非常にひどいです。)

于 2012-05-06T22:20:14.097 に答える
2

ここにはもう少し危険なことがあります:

for(p = 0; p <= i; p++)

あなたはおそらくしたい

for(p = 0; p < i; p++)

配列の最後から逆参照しようとしないようにします

おそらく書くほうがいい

for (int p = 0; p != i; ++p)

これは、MooとKoenigによる推奨フォームです:http ://www.drdobbs.com/cpp/184402072

またchar *、からの読み取り、文字列と入力の保存cinに使用することもありません。メイン関数の範囲外で必要ない場合は、メモリを使用する必要はありません。文字列は動的なサイズ変更もサポートしているため、サイズを初期化する必要はありません。これが、理解を助けるためにグーグルで検索した最初の例です。std::stringnewwriteFile

于 2012-05-06T22:21:26.123 に答える
1

なぜ「Cウェイ」を使ってファイル名を保存しているのですか?そして、あなたはそれを間違った方法で使用しています:char**。宣言する方が簡単です。

std::string fileName;
while(!std::cin >> fileName);
ofstream myfile(fileName.c_str());

また、ループ内でiを使用していますが、pを反復処理しています。これは、実行したいことではないと思います...

于 2012-05-06T22:25:15.207 に答える