2013-09-08 2 views
1

Я использую цикл while с getc() для чтения из дескриптора файла, и он отлично работает. Теперь я добавляю поддержку для труб.Как сделать getc() на stdin be двоичным

Моя проблема в том, что хотя x0A, X0D и x0A0D проходят очень хорошо, любые случаи x0D0A сводятся к просто x0A. Кроме того, x1A, кажется, полностью прекращает процесс, когда встречается.

Я собираюсь выполнить вывод tar и вворачивать файлы.

FILE *FH; 
FH=stdin; 
int buff; 
while((buff=getc(FH))!=EOF) { 
    //stuff 
} 

Это упрощено, поскольку FH необходимо указывать либо на файл, либо на stdin. Для тестирования я просто пишу бафф в файл, чтобы увидеть изменения. Код работает отлично, если FH является файлом.

Я видел такое же поведение по использованию смол, типа и кошки в качестве источника трубы

+0

Что OS вы? В Unix все потоки двоичные (перевод CRLF на '\ n' выполняется драйвером терминала, а не средой C). – Barmar

+0

MS Windows XP SP3 с компилятором MinGW. – user1488660

+0

Это можно сделать. NT5.1 отлично передает двоичные данные. Например, «cat testfile.bin | cat> output.bin» передает данные без изменений. Так же, используя команду native «type», то есть «type testfile.bin | cat> output.bin» – user1488660

ответ

1

Вам понадобится fopen с двоичным режимом. Я не уверен, если вы можете использовать freopen на stdin, но дать ему попробовать:

freopen(NULL, "rb", stdin); 
+0

Предполагаю, что вы имели в виду: «FH = freopen (NULL,« rb », stdin); но он segfaults, когда он попадает в getc (FH) – user1488660

+0

«stdin = freopen (NULL,« rb », stdin); не будет компилировать «lvalue, требуемый как левый операнд присваивания» – user1488660

+0

Фактически, он, вероятно, будет работать нормально, не присваивая результат ни к чему (вы можете проверить, что это не NULL tho ', поскольку это означает «ошибка»). –

0

Вы должны открыть файл в двоичном режиме вы пишете в. Комбинация 0d0a - это возврат каретки, за которой следует новая строка, и в зависимости от системы будет изменяться при записи в текстовом режиме.

+0

Я пишу как двоичный код, и он проходит без изменений, если FH из файла «FH = fopen (FN,« rb »); – user1488660

+0

Как вы можете писать, если используете режим «r»? – this

+0

Я продолжаю входы и выходы. В настоящее время я тестирую данные Piping в своей программе вместо чтения двоичного файла. Я всегда пишу двоичный код – user1488660