【问题标题】:read() for reading stream from stdinread() 用于从标准输入读取流
【发布时间】:2018-03-05 15:20:25
【问题描述】:

我正在尝试编写一个 C 代码(在 Ubuntu Linux 操作系统上运行),它连续从标准输入读取,并且每次接收不同长度的字节。每次接收缓冲区达到或超过 15 时,它都需要以 15 字节长的数组发送回标准输出。

规范草案

#include <stdio.h>
#include <unistd.h>

int main()
{
  char buff[100];

  // Round 1
  read(STDIN_FILENO, buff, 15);
  printf("Part 1:%s", buff);

  // Round 2
  read(STDIN_FILENO, buff, 15);
  printf("Part 2:%s", buff);

  return 0;
}

举一个场景的例子。我们收到 30 个字节,分 3 批,每次 10 个字节。在下面的示例场景中,我使用了 3 个 echo 命令来表示这一点。

还添加了当前草稿代码的预期输出和实际输出。任何具有预期输出的评论或建议(可能是另一个函数而不是 read 和 printf ?),我们将不胜感激。

场景

1号航站楼:

mkfifo /tmp/MyPipe
tail -f /tmp/MyPipe | ./StreamProcess

2号航站楼:

echo -ne '1234567890' >> /tmp/MyPipe
echo -ne 'abcdefghij' >> /tmp/MyPipe
echo -ne 'qwertyuiop' >> /tmp/MyPipe

1 号航站楼的预期输出

第一次回显后:没有打印任何内容

第二次回声后:

Part 1:1234567890abcde

第三次回声后:

Part 1:1234567890abcdePart 2:fghijqwertyuiop

1 号航站楼的当前输出(带有草稿代码)

第一次回显后:没有打印任何内容

第二次回声后:

Part 1:1234567890s·     s·Part 2:abcdefghijs·   s·

第三次回显后:(仅打印 $ 提示符)

Part 1:1234567890s·     s·Part 2:abcdefghijs·   s·$

【问题讨论】:

  • 这是特定于操作系统的(您可能使用 POSIX 或 Linux)。阅读poll(2) 并编辑您的问题以改进它(至少通过说明您正在编码的操作系统)
  • 1) char buff[100]; buff 未初始化 2) read(STDIN_FILENO, buff, 15); 读取返回一个值。用它! 3) printf("Part 1:%s", buff); buff 不一定是 nul 终止的。另外:在格式字符串中添加一个 '\n'。 `
  • @wildplasser 除非在全局范围内,否则缓冲区是否未预初始化?我的理解是需要放置空终止符,但缓冲区不需要归零。
  • 问题说读/写操作是连续的,但代码最多只能读取 30 个字节。

标签: c linux stream stdout stdin


【解决方案1】:

根据问题中列出的条件,以下代码将执行所需的操作。

编辑:合并 cmets 进行质疑。

编辑:添加错误检查

#include <stdio.h>   // printf(), STDIN_FILENO. perror()
#include <unistd.h>  // read(), exit(), EXIT_FAILURE

#define MAX_READ_LEN 15

int main( void)
{
    char buff[ MAX_READ_LEN+1 ];
    int partNum = 0;

    while( 1 )
    {
        // Round 1
        ssize_t bytesRead = read( STDIN_FILENO, buff, MAX_READ_LEN );

        if( 0 > bytesRead )
        {
            perror( "read failed" );
            exit( EXIT_FAILURE );
        }

        // implied else, read successful

        buff[ bytesRead ] = '\0';
        partNum++;
        printf("Part %d:%s\n", partNum, buff);
    }

    return 0;
} // end function: main

【讨论】:

  • 感谢您的回答。我在顶部添加了“#include ”。输出:第 1 部分:1234567890 第 2 部分:abcdefghij 第 3 部分:qwertyuiop
  • @JimRaynor,为什么要添加该声明:#include &lt;stdlib.h&gt;?我的答案和您发布的代码中的任何内容都不需要该头文件中的任何内容。
猜你喜欢
  • 1970-01-01
  • 2013-03-30
  • 2012-02-17
  • 1970-01-01
  • 2015-07-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-13
相关资源
最近更新 更多