在 cat 实现中以文本而不是二进制格式打印
Print in text instead of binary format in cat implementation
cat
程序的执行正在 Ubuntu 终端上以二进制格式打印。我正在使用 stdout
宏(FILE*
类型的对象)。
#include <stdio.h>
main(int argc, char** argv)
{
FILE *fp;
void add(FILE*, FILE*);
if (argc==1)
add(stdin,stdout);
else
while(--argc>0)
{
if ((fp=fopen(*++argv,"r"))==NULL)
{
printf("cat:can't open %s\n",*argv);
return 1;
}
else
{
add(fp,stdout); // printing all the file content on the screen.
fclose(fp);
}
return(0);
}
}
void add(FILE*p,FILE*q)
{
int c;
while((c=fgetc(p))!=EOF)
{
fputc(c,q);
}
}
现在,如何以文本格式而不是二进制格式打印?
错误在于你如何循环参数。剥离实际文件处理的代码并将其替换为打印语句(并很好地缩进),我们得到:
if (argc == 1)
printf("stdin\n");
else
while (--argv > 0) {
printf("'%s'\n", *++argv);
}
您在代码中将 argc
键入错误 argv
。这意味着您递减指向第一个参数的指针,然后在处理文件之前再次递增它。实际上,您最终会一遍又一遍地处理 argv[0]
。该文件就是程序本身,它是二进制的,包含许多不可打印的字符。
您应该将循环更改为
while (--argc > 0) {
printf("'%s'\n", *++argv);
}
或使用行人 for
循环:
for (int i = 1; i < argc; i++) {
printf("'%s'\n", argv[i]);
}
程序没有任何错误,只是打字错误 argv 而不是 argc 其余一切都很好,甚至比上面建议的答案更好
cat
程序的执行正在 Ubuntu 终端上以二进制格式打印。我正在使用 stdout
宏(FILE*
类型的对象)。
#include <stdio.h>
main(int argc, char** argv)
{
FILE *fp;
void add(FILE*, FILE*);
if (argc==1)
add(stdin,stdout);
else
while(--argc>0)
{
if ((fp=fopen(*++argv,"r"))==NULL)
{
printf("cat:can't open %s\n",*argv);
return 1;
}
else
{
add(fp,stdout); // printing all the file content on the screen.
fclose(fp);
}
return(0);
}
}
void add(FILE*p,FILE*q)
{
int c;
while((c=fgetc(p))!=EOF)
{
fputc(c,q);
}
}
现在,如何以文本格式而不是二进制格式打印?
错误在于你如何循环参数。剥离实际文件处理的代码并将其替换为打印语句(并很好地缩进),我们得到:
if (argc == 1)
printf("stdin\n");
else
while (--argv > 0) {
printf("'%s'\n", *++argv);
}
您在代码中将 argc
键入错误 argv
。这意味着您递减指向第一个参数的指针,然后在处理文件之前再次递增它。实际上,您最终会一遍又一遍地处理 argv[0]
。该文件就是程序本身,它是二进制的,包含许多不可打印的字符。
您应该将循环更改为
while (--argc > 0) {
printf("'%s'\n", *++argv);
}
或使用行人 for
循环:
for (int i = 1; i < argc; i++) {
printf("'%s'\n", argv[i]);
}
程序没有任何错误,只是打字错误 argv 而不是 argc 其余一切都很好,甚至比上面建议的答案更好