第二次输入后清洗管道

标签 c char pipe

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

我应该如何清理我的字符表?我不想要 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);
}                       

最佳答案

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

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

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

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

关于第二次输入后清洗管道,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50259476/

相关文章:

bash - 如何使用管道字符分隔符分隔字段

python - 子进程不会实时显示来自 tcpdump 的数据。它显示暂停约 10-20 秒

c - 如何用if语句结束程序?

c - 将字符打印到文件会产生奇怪的结果

java - Java 简介 - char 的使用如何工作?由随机数分配的字母?

java读取并写入\u05DC为 '?'

c - 使用管道写入和读取 Int 数组

初学者的c问题

复制文本文件错误

c - c中的函数指针typedef