【问题标题】:Print in text instead of binary format in cat implementation在 cat 实现中以文本而不是二进制格式打印
【发布时间】:2015-08-23 18:08:23
【问题描述】:

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);
    }
}

现在,如何以文本格式而不是二进制格式打印?

【问题讨论】:

  • “二进制格式”和“文本格式”是什么意思?
  • 我不明白你的问题。
  • while(--argv&gt;0) 应该是 while(--argc&gt;0)。为什么不使用简单的循环for (int i = 1; i &lt; argc; i++) process(argv[i])
  • while(--argv&gt;0) 没有任何意义。 argv 是指向指针数组的指针,即内存中的地址,为什么要与 0 进行比较? @MOehm 是对的,他们建议的代码更容易阅读和理解。不,您没有通过以这种方式编写代码来优化任何东西。时间复杂度是一样的,它是由你在函数add()中进行的大数据传输给出的。
  • @user4950013 为什么循环几个程序参数时时间复杂度相关?

标签: c file stdout cat


【解决方案1】:

错误在于你如何循环参数。剥离实际文件处理的代码并用打印语句替换它(并且也很好地缩进它),我们得到:

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 存在拼写错误。现在我的代码通过删除更正错字 Miss 运行良好。无论如何,for循环在这里的成本更高,即使在这种情况下最好使用 ++i 代替 ++i 检查 spatial.com/blog/3d-software-development-kits/… ++i 比 i++ 短
  • (1) 请以可读的方式组织您的代码和 cmets。 (2) 在考虑性能之前,先担心代码是否正确、稳定和可维护。
  • (3) 您链接的文章是关于 C++ 的,其中前置和后置增量可能是类的重载运算符。在这种情况下,您应该更喜欢前缀表示法,因为后缀表示法必须复制对象。这个问题是关于 C 的,其中增量只能应用于算术和指针类型。编译器注意到表达式 i++ 处于 void 上下文中,并创建与 ++i 相同的代码。 (C++ 中的基本类型也是如此,文中提到。)
  • 我在代码中看到的唯一问题是,如果由于某种原因无法访问其中一个文件,则会在连接输出的末尾打印诊断信息,这种情况可以是使用第二个输出流 stderr 处理一切都很好,如果你能证明代码仍然有某种错误或购买我肯定会接受你对所有投票者的回答,请让新人找到自己的路!!!
  • i++ 制作一个副本,增加 i,然后返回副本(旧值)。 ++i 增加 i,并返回 i。这就是我觉得 ++i 更快的原因。
【解决方案2】:

程序没有任何错误,只有拼写错误 argv 而不是 argc 其余一切都很好,即使比上面建议的答案也好

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-30
    • 1970-01-01
    • 1970-01-01
    • 2013-10-27
    相关资源
    最近更新 更多