2014-01-12 4 views
0

Я пишу программу, которая будет генерировать хэши для файлов или для строки из stdin. Однако fseek и ftell не будут работать на stdin, поэтому я не могу зарезервировать буфер, перемотать stdin в начало и прорвать весь поток. Так есть ли простой способ сделать это? Или я должен просто читать n символов каждый раз и отправлять его в функцию обновления состояния для каждого хэша?Прочитайте весь stdin до EOF в C

+3

«Или я должен просто читать n символов каждый раз и отправлять его в функцию обновления состояния для каждого хэша?» - Да. –

+1

Второй вариант (отправьте n символов одновременно, а затем окончательный, когда закончите), как я это сделаю. –

+0

Сведения могут быть специфичны для операционной системы. –

ответ

2

Если вы считаете, что stdin всегда текстовый, вы можете прочитать целые строки с него, используя getline(3).

Если вы хотите обрабатывать произвольный ввод (в том числе нетекстового стандартного ввода) вы должны использовать fread(3) в петле на некотором достаточно большом блоке (например, 4K или 16K байт) и принять во внимание частичное читает. Блок может содержать нулевые байты. Вы обновите состояние внутри цикла.

У вас может быть частичное чтение посередине, например. если вы читаете из трубы (с popen(3) ....) в Linux ...

+0

LSNED "частичное чтение посередине". – chux

Смежные вопросы