如何让 fgetc 在循环内打印文件的所有字符

Posted

技术标签:

【中文标题】如何让 fgetc 在循环内打印文件的所有字符【英文标题】:How do I get fgetc to print all the characters of a file inside of a loop 【发布时间】:2011-09-30 21:47:38 【问题描述】:

我正在玩 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);

但这并没有得到其他字符,因为循环仍然集中在第一个字符上

【问题讨论】:

您确定您的输入文件至少有 17 个字符吗? 【参考方案1】:

首先,&lt;stdio.h&gt; 中已经定义了一个名为 getchar() 的标准函数 - 您必须更改函数的名称,否则您可能会遇到一些非常奇怪的行为。

其次,在我看来,你想做的是:

打印出"line: "; 读取一个字符并打印它,直到文件结束或者您已经打印了 16 个字符; 打印出"\n"

这将转化为代码形式:

printf("line : ");

while (linecount < 16 && (c = fgetc(fp)) != EOF)

    printf("%c ", c);
    linecount++;


printf("\n");

【讨论】:

如果每行末尾多余的空格字符不受欢迎,可以更改为打印"line:",然后在循环中打印“%c”。【参考方案2】:
if((fp = fopen(argv[1], "rb+")) == '\0')

ASCII NUL 字符与NULL 指针不同。这应该是== NULLif(!(fp = fopen(argv[1], "rb+"))) /* ... */,无论您认为哪个更容易阅读。该子句中的return 0 可能应该是return 1,因此在标准管道中使用您的程序会更容易。 (程序中的错误通过非零返回值来明确。是的,有点倒退,但有good reason。)

void getchar(FILE *fp)

哎呀。 getchar(3) 已存在于 &lt;stdio.h&gt; 标头中。重新定义它不是一个好主意。 (它现在可能有效,但未来的修改可能会由于非显而易见的原因而完全失败。)

我对 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 [ ] ) 
  

【讨论】:

请注意,'\0' 是一个值为 0 的整数常量表达式,因此是一个有效的空指针常量(但仍表示相当混乱)。

以上是关于如何让 fgetc 在循环内打印文件的所有字符的主要内容,如果未能解决你的问题,请参考以下文章

如何在程序集的循环内打印字符串(MASM)

c语言 如何读取中文字符串

Ansi C:试图计算文件中的总字符数

C:使用fgetc()解析文件 - EOF无限循环

有没有办法在 O(n) 时间内打印字符串的所有子字符串?

c语言 怎么读文件中的汉字