2017-02-03 13 views
-5

のファイルを読み込むときセグメンテーションフォールトC

int textdump(const char *filename) 
{ 
    int count = 0; 

    FILE *file; 

    file = fopen(filename,"r"); 
    char letter; 
    while(!feof(file)) { 
     letter = fgetc(file); 
     if (isprint(letter)) { 
      printf("%c",letter); 
      count++; 
     } 
     else { 
      printf("?"); 
     } 

    } 
    fclose(file); 
    return count; 
} 
+6

[fgetc](https://linux.die.net/man/3/fgetc)は、 'int'を再実行します – LPs

+8

' while(!feof( ')はアンチパターンであり、常に間違っています。 – unwind

+8

!あなたが実際にあなたがそのコードでセグメンテーション違反を得ることができる唯一の方法だ(!ファイル= NULL) ' – LPs

答えて

2

オーケー...全く分からないなぜ、どのように私はそれをデバッグすることができ、私はCの文字でのファイルの文字を読み取ろうと私はセグメンテーションフォールトを取得するので、あなたのコードには、初心者のコードでよくある間違いがあります。ここで

は同じラインに沿ってそれを行う方法ですが、うまくいけば、エラーを修正:

size_t textdump(const char *filename) 
{ 
    size_t count = 0; 

    FILE * const file = fopen(filename, "rt"); 
    if(file == NULL) 
     return 0; 
    while (1) { 
     const int ch = fgetc(file); 
     if(ch == EOF) 
     break; 
     if(isprint(ch) { 
     putc(ch, stdout); 
     ++count; 
     } 
     else 
     putc('?', stdout); 
    } 
    fclose(file); 
    return count; 
} 

この:fopen()は有効であるファイルポインタに頼る前に、成功

  • チェックが。
  • intあるfgetc()の戻り値のための適切な型を使用します。
  • while(!feof()アンチパターンを修正します。
  • printf()よりも軽く、単一文字の出力用fputc()を使用します。
  • size_tを使用してカウントを表します。

私は、これは最適で、それはまだ単一文字は、インスタンスのための読書ん(しかし、それはあまりにも悪いことではないはずですので、バッファリング)とは言いませんよ。しかしそれはより良いはずです。

+1

ます'「RT」'標準のオープンモードです。 – melpomene

+1

'(unsigned char型)は'キャストは冗長である。私はいくつかの回は、なぜ私は習慣からそれを含んでいることについての警告を見てきました – melpomene

+0

@melpomene。これは、以来、奇妙な'isXXX()'関数はすべて 'int'をとります。貨物栽培を避けるためにそれを取り除きます。ありがとう。 – unwind

関連する問題