1

この単純なタスクには、迅速な解決策が必要です。

この機能を持つソースコードを変更しています:

OFCondition MdfDatasetManager::saveFile(const char *file_name,
                                        E_TransferSyntax opt_xfer,
                                        E_EncodingType opt_enctype,
                                        E_GrpLenEncoding opt_glenc,
                                        E_PaddingEncoding opt_padenc,
                                        OFCmdUnsignedInt opt_filepad,
                                        OFCmdUnsignedInt opt_itempad,
                                        OFBool opt_dataset)

関数内には、次の行があります。

    result = dfile->saveFile(file_name, opt_xfer, opt_enctype, opt_glenc,
                             opt_padenc,
                             OFstatic_cast(Uint32, opt_filepad),
                             OFstatic_cast(Uint32, opt_itempad),
                             (opt_dataset) ? EWM_dataset : EWM_fileformat);

file_name 変数を参照してください。

変更したいので、file_name の末尾に「.out」を追加します。

そこで、新しい変数を追加しました:

char *output_file;

dfile->saveFile() 関数を呼び出す前に、以下を追加しました。

strcpy(output_file, file_name);
strcat(output_file, ".out");

    result = dfile->saveFile(output_file, opt_xfer, opt_enctype, opt_glenc,
                             opt_padenc,
                             OFstatic_cast(Uint32, opt_filepad),
                             OFstatic_cast(Uint32, opt_itempad),
                             (opt_dataset) ? EWM_dataset : EWM_fileformat);

しかし、それはうまくいきません。

アプリケーションがクラッシュします。そして、問題は *output_file を初期化する必要があることだと思いますか?

問題は、私は C++ プログラマーではないということです:(

それで、誰か助けてもらえますか?

ありがとう。

4

7 に答える 7

5

にメモリが割り当てられていませんoutput_filestd::string代わりにaを使用します。

std::string s(file_name);
s += ".out";

次にs.c_str()、最初の引数として osaveFile()関数を使用します。

于 2012-09-25T08:32:55.873 に答える
2

多くの人が+=に追加".out"するために使用することを提案していますstring。これは正しく効率的ですが、実際には直感的ではありません。もっと自然な表現で考えれば…

std::string x = file_name + ".out";

char...コンパイラがポインタへのポインタをchar配列に追加するため、機能しないことがわかります。配列は何にも追加できないため、コンパイラは標準変換のリストを実行して、潜在的に意味のあるものを探します。悲しいことに、配列は別のポインターへの変換が可能charで、2 つのポインターの数値の合計が許可されます (最終的には単なる数値になります) が、結果は無関係なアドレスになります (ビットのためにラップすることさえあります)。 -size) は、プログラムの仮想アドレス空間に対応していない可能性があり、ランダムである可能性もあります。コンパイラーの時点では+、パラメーターを次の観点から考えていません。std::strings: 割り当ての右側にあるものは、左側の宛先が含まれる前に評価されます。したがって、それを機能させるための最小限の直感的な変更は、パラメーターの 1 つを明示的に次のよう+にすることstd::stringです。

std::string x = std::string(file_name) + ".out";

...また...

std::string x = file_name + std::string(".out");

多くのものを追加する式は左から右に評価さstd::stringれるため、最初または 2 番目のパラメーターとして a を取得したら、牛が帰ってくるまで他の ASCIIZ/C/ const char*「文字列」を追加できます。

于 2012-09-25T08:49:30.083 に答える
1

もちろんクラッシュします。output_file は、文字の配列へのポインタです。ただし、そのメモリを割り当てたり、ポインターを初期化したりしません。そのため、ヒープ上のランダムな領域を指します。コピーしようとすると、アプリがクラッシュします。

size_t total_size = strlen(file_name) + strlen(".out")+1;
char* output_file = new char[total_size];
memset(output_file, 0, total_size)
strcpy(output_file, file_name);
strcat(output_file, ".out");

割り当てられたメモリを削除する必要があることに注意してください。

ところで、気にする必要がないように、 std::string を使用しないのはなぜですか?

std::string output_file(file_name);
output_file+= ".out";
result = dfile->saveFile(output_file.c_str(), opt_xfer, opt_enctype, opt_glenc,
                         opt_padenc,
                         OFstatic_cast(Uint32, opt_filepad),
                         OFstatic_cast(Uint32, opt_itempad),
                         (opt_dataset) ? EWM_dataset : EWM_fileformat);
于 2012-09-25T08:36:21.410 に答える
0
#include <string>     // at the top of the program

std::string output_file = file_name;
output_file += ".out";
result = dfile->saveFile(output_file.c_str(), opt_xfer, opt_enctype, opt_glenc,
                         opt_padenc,
                         OFstatic_cast(Uint32, opt_filepad),
                         OFstatic_cast(Uint32, opt_itempad),
                         (opt_dataset) ? EWM_dataset : EWM_fileformat);
于 2012-09-25T08:33:08.147 に答える
0

使用std::stringして生活を楽にします:

std::string outputFile(output_file);
outputFile += ".out";

result = dfile->saveFile(outputFile.c_str(), ... );
于 2012-09-25T08:33:46.330 に答える
0

すべての C アプローチ:

output_file = malloc(strlen(output_file) + 5);
strcpy(output_file, file_name);
strcat(output_file, ".out");

PS free(output_file)output_fileを使い終わった後に必要になります。

于 2012-09-25T08:33:58.047 に答える
0

次の例のように、新しい文字列にメモリを割り当てる必要があります。

char *cNewString = malloc(strlen(file_name)+5); //+5 for the ".out"

そしてそれをコピーします。

使用しなくなったらメモリを削除することを忘れないでください

于 2012-09-25T08:34:33.653 に答える