2016-03-27 7 views
1

私は問題を抱えている部分だけにコードを削除します。ユーザ入力を使用してファイル名を取得すると、セグメンテーション違反が発生するのはなぜですか?

私は次のことを行うと、コードが

int main() {   
    FILE * fptr1 = fopen("in.txt", "r"); 
    fread(data, sizeof(char), size, fptr1); 
    . 
    . 
    . 
    FILE * fptr2 = fopen("out.txt", "w"); 
    fwrite(data, sizeof(char), size, fptr2); 
    fclose(fptr2); 
} 

に動作します。しかし、私はfgetsのか、scanf関数を使用して、入力および出力ファイル名を取得するためのfgetsを使用する場合、私はセグメンテーションフォールトを取得します。

int main() { 

    char inputfile[100]; 
    char outputfile[100]; 
    printf("name of input file: \n"); 
    fgets(inputfile, 100, stdin); 
    printf("name of output file: \n"); 
    fgets(outputfile, 100, stdin); 
    . 
    . 
    . 
} 

私はこれをしばらくの間プレイしています。私は、scanf関数を使用してみましたし、入力ファイルとOUTPUTFILEのために割り当てられたサイズを変更してみましたが、私は入れません:

Segmentation fault (core dumped) 
+0

'inputfile'と' outputfile'を確認してください。それらは終端 ''\ n' 'を含んでいますか? – timrau

+0

しかし、 '\ n'はセグメンテーションフォルトを引き起こしますか?私が知る限り、セグメンテーションフォルトは、割り当てられたメモリの外のメモリにアクセスすることによって発生します。 '\ n'は名前が間違っているためにファイルを見つけられないようにしてはいけませんか? – user6005857

答えて

4

fgets()では、結果のファイル名inputfileoutputfileは行末の改行文字が含まれています。次のようなエラーが発生し、が失敗し、NULLが返されます。

fread()またはfwrite()を呼び出す前に、無効な値がFILE*であることを確認していないため、セグメンテーション違反が発生しました。

1

fgets()を使用して入力された文字列には、通常「\ n」という終了文字が含まれています。これによりセグメンテーションが直接発生することはありませんが、fopen()はそのファイルを見つけることができないため、NULLを返すことがあります。 nullファイルポインタからデータを読み取ろうとすると、segfaultが発生します。

あなたfopen()文の後

if(fptr1 == 0) 
{ 
    perror("fopen()"); 
    exit(EXIT_FAILURE); 
} 

を追加します。

関連する問題