3

私はfgetcで遊んでいて、ループで行セクションを一度印刷してから最初の16文字を印刷する方法を考えていました。

これが私のコードです:

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");
        }
    }
}

出力を次のようにしたい:

 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ループを使用して文字を印刷しようとしました:

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

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

4

2 に答える 2

6

getchar()まず、 defined inという標準関数が既に存在<stdio.h>します。関数の名前を変更する必要があります。変更しないと、非常に奇妙な動作が発生する可能性があります。

第二に、あなたがやりたいことは次のとおりです。

  • 印刷してください"line: "
  • ファイルの終わりまで、または16文字を印刷するまで、文字を読み取って印刷します。
  • 印刷し"\n"ます。

これは、次のようなコード形式に変換されます。

printf("line : ");

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

printf("\n");
于 2011-07-08T00:23:19.577 に答える
3
if((fp = fopen(argv[1], "rb+")) == '\0')

ASCII文字はポインタNULと同じではありません。NULLこれは== NULL、またはif(!(fp = fopen(argv[1], "rb+"))) /* ... */のどちらか、読みやすいと思う方になります。この句のreturn 0inはおそらくであるはずreturn 1なので、標準のパイプラインでプログラムを操作する方が簡単です。(プログラムのエラーは、ゼロ以外の戻り値によって明らかになります。はい、少し逆ですが、正当な理由があります。)

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 [ ] ) 
 { 
于 2011-07-08T00:27:17.520 に答える