2

特定のテキストファイルを解析しようとしていますが、これまでのところ、私のプログラムは正しく読み取っていないようです。

#include <stdio.h>


int main(int argc, char *argv[])
{
    FILE *fr; //file pointer
    int buildingFloors = 1;

    printf("sanity check\n");  

    fr = fopen (argv[0], "r");
    fscanf(fr, "%d", &buildingFloors );

    printf("%d\n", buildingFloors);

    fclose(fr);

    return 0;
}

次のコマンドを使用して、プログラムをコンパイルし、redhat Linux マシンで実行します。

./sjf file.text

file.text は、最初の文字が「4」のテキスト ドキュメントです。だから私は私の出力が

sanity check
4

ただし、プログラムを実行すると、代わりに

sanity check
1

これは、fscanf が最初の文字を正しく読み取らなかったことを意味します -- 4. 期待されるコード機能を妨げている構文エラーがありますか? 文字をスキャンしてから、それをintに変換することになっていますか?

4

3 に答える 3

5

argv[0]はプログラムの名前(./sjfあなたの場合)なので、自分のプログラムの実行可能ファイルを読み込もうとしています。argv[1]代わりに、最初の実際のプログラム引数を取得するために使用します。

于 2011-02-25T22:15:42.053 に答える
4

すぐに頭に浮かぶことの1つは、プログラム引数に実行可能ファイル名が最初の要素として含まれていることです。

argv[0]「sjf」です

argv[1]「file.text」です

だからあなたは使うべきです

fr = fopen (argv[1], "r");

デバッグするときは、常に問題を絞り込んでください。エラーの場所がわかっている場合は、原因が明らかになるか、少なくとも調査可能になることがよくあります。

この場合、正しいファイルを開こうとしていることを確認argc >= 2し、印刷してから、ファイルが正常に開かれたことも確認する必要があります。argv[1]

最後に、fscanfエラーコードをチェックして、fscanfが番号を読み取れたことを確認します。

于 2011-02-25T22:15:39.760 に答える
0

コードは明確でわかりやすいように見えますが、欠落している重要なことが1つあります。それは、エラー処理です。

開きたいファイルが存在しない場合はどうなりますか?その場合、fopenはNULLを返します。

ファイルが数字で始まらない場合はどうなりますか?fscanfは、正常に読み取られたフィールドの数を返すため、戻り値が少なくとも1であることを確認する必要があります。

おそらくエラーメッセージを出力してプログラムを終了することにより、これらのケースを何らかの方法で処理する必要があります。その際は、必ずエラーメッセージに関連情報を含めてください。次に、他の回答ですでに言及されているバグが見つかります。

于 2011-02-25T22:23:09.873 に答える