我是新来的,我是 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/