0

これは以前は機能していました。動作を停止するために何をしたかわかりませんが、存在しないファイル名を入力すると、セグメント違反エラーが発生し、プログラムが終了します。

int main()
{
    File *fr;
    char input_file[32];
    int num_lines, valid;

    do{
        printf("\nEnter the name of the input file: ");
        scanf("%s", input_file);
        fr = fopen(input_file, "r");
        if(fr == NULL){
            valid = 0;
            printf("File does not exist...");
        }
        if(fr != NULL){
            fscanf(fr, "%d", &num_lines);
            numbers = malloc(sizeof(int) * num_lines);
            for(i=0;i<num_lines;i++){
                fscanf(fr, "%[^0123456789]%d", numbers+i);
                printf("%d\n", numbers[i]);
                valid =1;
            }
            free(numbers);
            fclose(fr);
        }

    }while(valid == 0);
}

/編集済み/

4

5 に答える 5

3

次の点に注意してください。

fr = fopen(input_file, "r");
fscanf(fr, "%d", &num_lines);
if(fr == NULL){

ここでは、ファイルが正常に開かれたかどうかを最初にテストせずに、 からfopen直接結果を渡しています。fscanfファイルを開くことができない場合は、frになるNULLため、セグメンテーション違反になります。

fscanf確認するまでは実行しないように、コードの順序を変更してみてくださいfr != NULL。例えば:

fr = fopen(input_file, "r");
if(fr != NULL){
    fscanf(fr, "%d", &num_lines);

お役に立てれば!

于 2012-04-05T21:05:00.090 に答える
3

さて、この行は非常に間違っています:

    scanf("%s", input_file[32]);

2 番目の引数は文字バッファーへのポインターである必要がありますが、ランダムな場所を指す可能性のある文字値を渡しています。一見問題なく動作するように見えますが、何らかの理由で必要になる可能性のあるメモリ内のランダムな場所が破損する可能性があります。

次に、 null かどうかを最初に確認せずに、fopen()直接呼び出した結果を渡します。fscanf()それもうまくいきません。

于 2012-04-05T21:05:13.413 に答える
1

fscanfif を確認する前に、呼び出しを に移動したに違いありませんfr==NULLfr==nullチェック後に fscanf を移動する必要があります。

于 2012-04-05T21:05:26.110 に答える
1

fr呼び出しの前に NULLかどうかを確認fscanf(fr, "%d", &num_lines) し、最初の scanf を変更する必要があります。scanf("%s", input_file);

于 2012-04-05T21:05:28.107 に答える
1

チェックする必要があります

if(fr == NULL){
   valid = 0;
   printf("File does not exist...");
}   

fscanf(fr, "%d", &num_lines);
于 2012-04-05T21:05:56.347 に答える