0

ユーザーに 1 つのファイルを指定するオプションを提供したいと考えています (ここではground_truth_filename)。彼がオプションを指定しない場合、デフォルトのファイル名を仮定したいと思います。

ただし、メインプログラムのように初期化しても、ground_truth_filenameNULLゼロかどうかを確認できません。0引数がユーザーによって渡された場合、その引数に割り当てground_truth_filenameます。しかし、チェックground_truth_filename == 0でアサートエラーが発生します。

どんな助けでも大歓迎です。

int processFile(const char *filename, 
                YAML::Emitter &out_yaml, 
                char *ground_truth_filename)
{   
    std::cout << "Here" << std::endl;

    if (ground_truth_filename == 0)
        sprintf(ground_truth_filename,"%s.yaml",filename);        

    std::ifstream imgstrm(filename, std::ios::binary | std::ios::in);

    if (imgstrm.bad() || !imgstrm.is_open())
    {
        fprintf(stderr, "Failed to open file: %s\n", filename);
        return FILE_ERROR;
    }

    // get ground truth
    std::ifstream ground_truth_stream(ground_truth_filename);

    if (!ground_truth_stream.is_open()) 
    {
        fprintf(stderr, "Failed to open file: %s\n", ground_truth_filename);
        return FILE_ERROR;
    }
}

関数の呼び出し方法は次のとおりです。おそらく、ground_truth_filename = '\0' を初期化する必要がありますか?

char *ground_truth_filename = 0;
for (int i = 1; i + 1 < argc; i += 2) {
            if (!strcmp(argv[i], "--snapshot-markup")) {
                ground_truth_filename = argv[i + 1];
                markupFlag = true;
            }
        }
processFile(filename, out_yaml, ground_truth_filename)
4

2 に答える 2

1

の最初の引数はsprintf、出力を保持するのに十分な大きさのバッファーへのポインターでなければなりません。NULLポインターまたはより小さい char バッファーへのポインター (たとえば、文字列リテラル "") は、クラッシュを引き起こします。

動作するコードは次のとおりです。

char buf[256];

if (ground_truth_filename == NULL) {
   int charsneeded = snprintf(buf,sizeof(buf),"%s.yaml",filename);
   if (charsneeded >= sizeof(buf)) {
     return FILE_ERROR; // filename too long
   }
   ground_truth_filename = buf;
}

ポイントはbuf、新しい人filenameが記憶の中で生きる場所を与えることです. 文字列にはそれが必要です。

編集:安全対策として、長すぎるファイル名から保護するために charsneeded を追加しました。実際に必要になると予想される場合は、代わりに buf を動的に割り当てます。

于 2013-02-12T18:38:14.593 に答える
0

文字をコピーする前に、ground_truth_filename を割り当てる必要があります。

 if (ground_truth_filename == 0)
  {
    int length = strlen(filename) + strlen(".yaml") + 1;
    ground_truth_filename = new char[length];
    sprintf(ground_truth_filename,"%s.yaml",filename);   
  }
于 2013-02-12T18:37:25.463 に答える