2011-07-08 3 views
3

私はfgetcを使いこなしていますが、最初の16文字を一度印刷してループセクションを印刷する方法を知りました。ここでループ内のファイルのすべての文字を印刷するfgetcを得るにはどうすればいいですか?

は私のコードです:私はループのためにこれを使用して文字を印刷しようとした

line: ? 5 d s d a d 0 0 0 0 0 0 0 0 0 0 0 
line: a d s x c v d 0 0 0 0 0 0 0 0 

for(i = 0; i < 16; i++) 
{ 
    printf("%c ", c); 
} 

int main(int argc, char * argv[]) 
{ 
    FILE *fp; 

    if((fp = fopen(argv[1], "rb+")) == '\0') 
    { 
     perror("fopen"); 
     return 0; 
    } 

    getchar(fp); 

    return 0; 
} 

void getchar(FILE *fp) 
{ 
    int c; 
    size_t linecount = 0; 

    while((c = fgetc(fp)) != EOF) 
    { 
     printf("line : "); 
     printf("%c ", c); 
     linecount++; 

     if(linecount == 16) 
     { 
      printf("\n"); 
     } 
    } 
} 

は、私は私の出力のようなものになりたいです

しかし、ループが最初の文字にまだ集中していたので、それは他の文字を取得しませんでした

+0

あなたはあなたの入力ファイルには、少なくとも17個の文字を持っていますか? –

答えて

6

<stdio.h>に定義されているgetchar()という標準機能が既にあります。機能の名前を変更する必要があります。また、非常に奇妙な動作が発生することがあります。

第二に、あなたがやりたいことはあるように私には思える:

  • プリントアウト"line: "
  • 文字を読み取り、ファイルの終わりまで、または16文字を印刷するまで、それを印刷します。
  • "\n"を印刷します。

これはコード形式に変換します:ASCII NUL文字はNULLポインタと同じではありません

printf("line : "); 

while (linecount < 16 && (c = fgetc(fp)) != EOF) 
{ 
    printf("%c ", c); 
    linecount++; 
} 

printf("\n"); 
+2

各行の末尾の余分な空白文字が望ましくない場合は、 ''行を印刷するように変更してからループ内の "%c"を変更することができます。 –

3
if((fp = fopen(argv[1], "rb+")) == '\0') 

。これは、== NULL、またはif(!(fp = fopen(argv[1], "rb+"))) /* ... */のいずれかが読みやすいと思われる方にしてください。この句のreturn 0はおそらくreturn 1であるはずです。そのため、プログラムで標準パイプラインで作業する方が簡単です。 (プログラムのエラーがはい、それは少し後方だが、good reasonがあります。ゼロ以外の戻り値によって明らかにされている。)

void getchar(FILE *fp) 

おっと。 getchar(3)は既に<stdio.h>ヘッダーに存在します。それを再定義することは良い考えではありません。 (。それは今働くかもしれないが、将来の変更が完全に非明白な理由のために失敗することがあります)

私はgc()日常の小さなループを再働いてきた、それはあなたが必要なものを行う必要があります。

#include <stdio.h> 

void gc(FILE * fp); 

int main(int argc, char *argv[]) 
{ 
    FILE *fp; 

    if ((fp = fopen(argv[1], "rb+")) == NULL) { 
     perror("fopen"); 
     return 1; 
    } 

    gc(fp); 

    return 0; 
} 

void gc(FILE * fp) 
{ 
    int c; 
    size_t linecount = 0; 

    while ((c = fgetc(fp)) != EOF) { 
     if (linecount == 0) 
      printf("line : "); 

     printf("%c ", c); 

     if (++linecount == 16) { 
      printf("\n"); 
      linecount = 0; 
     } 
    } 
} 

出力自体で実行します。

$ ./printer printer.c | head 
line : # i n c l u d e < s t d i o . 
line : h > 

v o i d g c (F I L E 
line : * f p) ; 

i n t m a i 
line : n (i n t a r g c , c h a r 
line : * a r g v [ ]) 
{ 
+1

''\ 0''は値が0の整数定数式であり、したがって有効なヌルポインタ定数です(ただし、依然としてかなりの混乱を示しています)。 – caf

関連する問題