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()定义的标准函数<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')

ASCIINUL字符与NULL指针不同。这应该是== NULLif(!(fp = fopen(argv[1], "rb+"))) /* ... */,无论您认为哪个更容易阅读。该return 0子句中的 可能应该是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 回答