第二次输入后清洗管道

时间:2018-05-09 17:59:35

标签: c char pipe

我是新来的,我是C编程的初学者。我使用管道将一个文件复制到另一个文件时遇到问题。我的缓冲区大小是10.当我从我的文件in.txt复制到out.txt时,char表的末尾总是留下一个“p”。这只是因为我的上一个输入只包含9个字符,而第十个字符来自之前的输入。 “读者:msg88 = nulla p 读者:msg89 = ariatur? p “

我应该怎么做才能清理我的char表?我不想要msg89上的最后一个“p”。我需要它是相同的文件,但in.txt末尾不包含“p”而out.txt包含。当我使用md5sum时,情况就不一样了:

197ee73779d545f0d3dc7981131736c0  in.txt
ed36f720a1ffc7e82983545d6305edc3  out.txt

代码:

filefd = open(argv[1], O_RDONLY, 0);
for(int i = 0; read(filefd, message, 10) > 0; i++)
{
    printf("writer: msg%d=%s\n", i+1, message);
    fflush(stdout);
    write(fd[1], message, 10);
    usleep(100000);
}


filefd = open(argv[2], O_WRONLY | O_CREAT | O_TRUNC, 0666);
for(int i = 0; read(fd[0], message, 10) > 0; i++)
{
    printf("reader: msg%d=%s\n", i+1, message);
    fflush(stdout);
    write(filefd, message, 10);
    usleep(120000);
}                       

1 个答案:

答案 0 :(得分:0)

read返回读取的字节数,因此您应该能够执行以下操作:

ssize_t bytesread;
for (int i = 0; (bytesread = read(fd[0], message, 10)) > 0; i++)
{
  ...
  write(filefd, message, bytesread);
  ...
}

我的想法是检查调用read读取的字节数(我将其存储在名为bytesread的变量中)并将该数字传递给write调用而不是总是通过10。

我假设您会在发布的两段代码中进行类似的更改。