在 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 其余一切都很好,甚至比上面建议的答案更好