0

私は、ファイル名を引数として取り、ファイルを開き、その内容を解析して、いくつかのことを行うプログラムを作成しました。私はそれを実行することによってそのプログラムをテストするテストプログラムを書いています。

これが私のテストクラスです:

int main () {

    FILE *input;
    input = fopen("file.txt", "w+");
    if (input == NULL) {
    fprintf(stderr, "Unable to create a new file");
    exit(1);
    }

    fprintf(input, "8\n");

    if (execl("./a.out", "./a.out", "file.txt", NULL) == -1) {
    fprintf(stderr, "Error forking program\n");
    exit(1);
    }

    return 0;
}

を開くfile.txtと、空白のファイルしか表示されません。私の./a.outプログラムは解析エラーを出している(fgetsNULLを返している)file.txtが、書き込まれていないためだと思う。ここでの問題は何ですか?このような問題をデバッグするにはどうすればよいですか?なぜfprintfファイルに書き込まないのでしょうか。

ありがとうございました、

4

2 に答える 2

3

ファイルをフラッシュする必要があります-fflushを参照してください。POSIXシステムでは、すべてのprintfでフラッシュする場合は、setbufまたはsetvbufを使用することもできます。

編集:実際、コードで行うべき適切なことは、execlの前にファイルをfcloseすることです。もちろんそれはそれをフラッシュします。また、「w +」は必要ありません。また、「input」は、書き込み先のファイルに適した名前ではありません。

さらに、プログラムにa.outという名前を付けるのではなく、適切な名前を付ける必要があります。実行されているプログラムがわからないため、a.outのexeclは特に危険です。上記のプログラムを-oフラグなしでコンパイルすると、a.outが上書きされ、それを呼び出すと、それ自体が再帰的に実行され、無限ループが発生します。幸い、(誤った)エラーメッセージとは異なり、フォークを実行しないため、システムがプロセスで溢れることはありません。

ちょっとしたこと:printfsを\nで終了することを忘れないでください...最初のものが欠けています。徹底的なテストが行​​われていないエラーメッセージでは、これについて特に注意してください。

于 2012-07-28T00:33:57.253 に答える
1

明確に指定したくないものですが、このプログラムと同じイメージの./a.outを使用していると思います。

最初の問題は、コマンドライン引数の配置がないことです。

2番目の問題はあなたが使用することです

fopen("test.txt","w+");

//存在する場合はファイルを開き、切り捨てます。存在しない場合は作成します

つまり、常に新しいファイルです。以前のコンテンツは利用できません。以前のファイルのコンテンツも必要な場合は、

fopen("test.txt","a");

ファイルから読み取るには、次も使用します

fopen("test.txt", "a+");

rewind()また、使用時にファイルを呼び出す必要がa+あり、ファイルはすでに存在します。

3番目の問題は、現在の画像を別の画像に置き換えるため、再帰のように機能します。ファイルを適切に閉じることが維持されないため、タイムアウトによってバッファが適切にフラッシュされません。

これは無限ループのような動作です。したがって、このプログラムの使用法はお勧めしません。

于 2012-07-28T01:18:14.450 に答える