我正在玩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);
}
但这并没有得到其他角色,因为循环仍然集中在第一个角色
答案 0 :(得分:6)
首先,getchar()
中已经定义了一个名为<stdio.h>
的标准函数 - 您必须更改函数的名称,否则您可能会遇到一些非常奇怪的行为。
其次,在我看来,你想做的是:
"line: "
; "\n"
。这将转换为代码形式:
printf("line : ");
while (linecount < 16 && (c = fgetc(fp)) != EOF)
{
printf("%c ", c);
linecount++;
}
printf("\n");
答案 1 :(得分:3)
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 [ ] )
{