1

我正在使用以下代码从标准输入读取

int size;
int bufferSize=2000;
char echoString[bufferSize];
while ((size = read(fileno(stdin), echoString, bufferSize)) > 0){
 write(fileno(stdout), echoString, size);
}

把从标准输入获得的数据写在屏幕上……但它不能很好地工作。如果我做一只猫“hugetarfile.tar.gz”| ./我的程序 | tar -zvt 它可以工作,但最后它“崩溃”告诉有一些垃圾。如果我做 cat "hugetarfile.tar.gz" | tar -zvt 它就像一个魅力..

在焦油的末尾,您可以看到:

gzip: stdin: 解压OK,尾随垃圾被忽略 tar: Child 返回状态 2 添加文件 *fin = freopen(nill, "rb", "stdin")

有人可以帮助我吗?xD

只是告诉...我正在创建读取以通过套接字发送,但在这种情况下,这场战争更容易测试。

4

2 回答 2

2

我以最简单的方式完成了您的程序,使其在没有警告的情况下编译gcc -ansi -D_POSIX_C_SOURCE -Wall -W demonofnight.c

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

int main()
{
    int size;
    int const bufferSize=2000;
    char echoString[bufferSize];
    while ((size = read(fileno(stdin), echoString, bufferSize)) > 0){
        write(fileno(stdout), echoString, size);
    }
    return 0;
}

并执行它

cat bigFile | ./a.out | md5sum

对于几个大文件。我得到的 md5 与md5sum bigFile.

结论:错误在于您没有向我们展示的内容。

于 2012-01-24T15:28:40.390 回答
0

您必须测试读写中的错误。你为什么不像这样测试你的程序:

./myprogram < hugetarfile.tar.gz > output.tar.gz  

并确保 hugetarfile.tar.gz 和 output.tar.gz 相同。

问候

于 2012-01-24T15:12:26.973 回答