如何让 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】:首先,<stdio.h>
中已经定义了一个名为 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
指针不同。这应该是== 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 [ ] )
【讨论】:
请注意,'\0'
是一个值为 0 的整数常量表达式,因此是一个有效的空指针常量(但仍表示相当混乱)。以上是关于如何让 fgetc 在循环内打印文件的所有字符的主要内容,如果未能解决你的问题,请参考以下文章