1

私は次のコードを使用してstdinから読み取ります

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

stdinから取得したデータを画面に書き込むには...しかし、うまく機能しません。猫をやるなら"hugetarfile.tar.gz"| ./myprogram | tar -zvtは機能しますが、最終的には「クラッシュ」して、ゴミがあることを示します。猫「hugetarfile.tar.gz」をやるなら| tar-zvtそれは魅力のように機能します。

タールの終わりにあなたが見ることができます:

gzip:stdin:解凍OK、末尾のガベージは無視されますtar:子がステータス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 に答える