0

ハフマン ツリーをファイルにシリアル化しようとしていますが、問題の再帰的な性質に問題があります。cout を使用してコンソールに出力するのに問題はありませんが、文字列に保存したり、ファイルに書き込もうとすると、セグメンテーション違反が発生します。

string putData(Node *n, string &s) {

  if (n->leaf()) {
    s << "[" << n->value() << "]";
  } else {
    s << ".";
  }

  if (n->left())
    putData(n->left(), s);

  if (n->right())
    putData(n->right(), s);

}

ofstream オブジェクトと同じ問題です。実際、プログラムが segfault した後、ファイルとその内容が適切であることを確認します。しかし、なぜ最後にセグメンテーション違反になるのでしょうか? プログラムのセグメンテーション違反を停止するにはどうすればよいですか?

string putData(Node *n, ofstream &s) {

  s.open("huffout.txt", ios::app);

  if (n->leaf()) {
    s << "[" << n->value() << "]";
  } else {
    s << ".";
  }
  s.close()
  if (n->left())
    putData(n->left(), s);

  if (n->right())
    putData(n->right(), s);

}
4

1 に答える 1

3

あなたの関数は戻るように宣言されてstringいますが、セグメンテーション違反を引き起こす可能性のある戻り値を見ると、return ステートメントがありません。コンパイラは return の欠落について警告するはずでしたが、警告付きでコンパイルしていませんか?

また、最初のコード例では a を使用してstringいますが、それに を追加しようとしていoperator<<ます。おそらく、これは単なるコピー アンド ペースト エラーです。

于 2012-12-30T17:49:17.493 に答える