Читать из стандартного ввода с помощью чтения - PullRequest
1 голос
/ 24 января 2012

Я использую следующий код для чтения из стандартного ввода

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

Чтобы записать данные, полученные из стандартного ввода на экране ... но это не работает хорошо. Если я сделаю кошку "hugetarfile.tar.gz" | ./myprogram | tar -zvt это работает, но в конце концов он "рухнул", сообщив, что есть какой-то мусор Если я сделаю кошку "hugetarfile.tar.gz" | tar -zvt работает как шарм ..

на конце смолы вы можете увидеть:

gzip: stdin: распаковка в порядке, завершающий мусор игнорируется tar: ребенок вернул статус 2 добавлен файл * fin = freopen (nill, "rb", "stdin")

Кто-то может мне помочь? XD

Просто чтобы сказать ... я создаю чтение для отправки через сокет, но в этом случае эту войну легче протестировать.

Ответы [ 2 ]

2 голосов
/ 24 января 2012

Я выполнил вашу программу самым простым способом, чтобы она скомпилировалась без предупреждения с помощью 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.

Вывод: ошибка в том, что вы нам не показываете.

0 голосов
/ 24 января 2012

Вы должны проверить на наличие ошибок при чтении и записи.Почему бы вам не протестировать вашу программу, например:

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

и убедиться, что hugetarfile.tar.gz и output.tar.gz совпадают.

С уважением

...