【问题标题】:How to change this code to write to stdout instead?如何更改此代码以写入标准输出?
【发布时间】:2012-03-18 22:31:48
【问题描述】:

我正在尝试将其更改为打印到终端屏幕而不是文件。所以我正在尝试打印到标准输出。

char    buf;    
int s, n;       
char filename[LINELEN];
char *recfile = "recfile.txt";
FILE *finp;

fflush(NULL);
while(buf != EOF)
{
    fflush(finp);
    if (read(s, &buf, 1) < 0) {
        printf("\terror in recieving file\n");
    }
    if(buf != EOF)
    (void) fputc(buf, finp);
}
fclose(finp);
close(s);

我试图做出这个改变。

finp = freopen("/dev/null","w+", stdout); 

linux 中的一切都是文件,对吧?那为什么没用呢?

【问题讨论】:

  • 我认为您并未展示所有代码。但是为什么不直接调用putc() 而不是fputc()?如果您希望输出继续stout,似乎将其重定向到/dev/null 不是一个好主意...
  • 我正在尝试...打印到终端屏幕您为什么认为freopen("/dev/null","w+", stdout) 会将stdout 重新关联到终端?
  • 这个程序片段几乎肯定不能工作,原因有几个。我们需要查看所有源代码,最好是它试图读取的输入文件的示例。

标签: c linux file-io stdout


【解决方案1】:

不应该是fputc(buf, stdout);吗?

【讨论】:

    【解决方案2】:

    您打开 /dev/null 并将标准输出重定向到它,但是向 /dev/null 写入一个字符会忽略它。在这种情况下,freopen() 将stdout 重定向到文件/dev/null

    【讨论】:

      【解决方案3】:

      该程序还有其他几个问题。

      读取文件使用:

      if (read(s, &buf, 1) < 0) ...
      

      不会将 EOF 值放入 buf,所以

      if(buf != EOF)
      

      while(buf != EOF)
      

      到达文件末尾时不会终止。

      如果buf将字符值0xFF放入其中,则该值将被符号扩展,并被误认为EOF

      read 通过返回 0 表示文件结束。

      s 未正确初始化,因此在读取文件描述符时可能无法预测。

      【讨论】:

      • @Dave - 为什么你编辑了我的答案文本,并且似乎用完全相同的字符替换了每个字符,即除了 HTH 之外,我没有看到任何更改?跨度>
      • 主要是因为我不小心投了反对票,但它被锁定了,所以我不得不编辑取消投票。除此之外,HTH 通常不是 stackoverflow 形式,使用 4 个空格代码块可以实现语法高亮。
      • @Dave - 感谢您对我的反对!-) 也感谢您的 HTH 提示,我使用它,并且我已经看到它使用它,所以我不知道。我去看看什么是“4空格”,我一直在用{}命令做高亮。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-13
      • 2019-07-12
      • 2011-11-03
      • 2020-01-19
      • 2014-07-03
      • 2012-09-30
      相关资源
      最近更新 更多