2015-03-30 3 views
2

Я побежал следующую программу под Cygwin/GCC 4.7.3 и VS 2010.Является ли stdout обязательным для текстового потока?

#include <stdio.h> 

int main() 
{ 
    printf("This is a test.\n"); 
    return 0; 
} 

Выход запуска программы в этих условиях показали, что VS 2010 обрабатывает stdout в виде текстового потока.

Вопросы:

  1. Требуется, чтобы быть текстовый поток stdout?
  2. Является ли реализация свободной для выбора, использует ли она текстовый поток или двоичный поток для stdout?

РЕДАКТИРОВАТЬ

Вопрос о том, как написать stdout в двоичном режиме отличается от stdout, требуется ли, чтобы быть текстовый поток или двоичный поток.

+0

Вы пытаетесь записать двоичные данные в 'stdout'? Если да, то почему? Почему бы просто не открыть файл в двоичном режиме и написать ему? –

+0

@ KeithThompson, нет, я этого не делал. Я нахожу, что я прокладываю «stdout» программ Windows для дальнейшей обработки в cygwin и хочу четко понимать, чего ожидать. –

ответ

3

stdout обязательный текстовый поток, равно stdin и stderr. От стандарта C99, 7.19.3 (7):

При запуске программы, три потоки текста предопределены и не должны быть открыты в явном виде - стандартный ввод (для чтения обычного ввода), стандарт выход (для записи обычный выход), и стандартная ошибка (для записи диагностического выхода). (...)

(выделено мной)

Для справки: в пересмотре стандарта С 2011 года это была перенесена без изменений в 7.21.3 (7).

Обратите внимание, что это означает, что эти три потока являются потоки текста при запуске. На некоторых платформах предусмотрены способы переключения режима позже, например _setmode под Windows.

Просто для полноты картины: что stdin, stdout и stderr относятся к этим потокам определено в 7.19.1 (3).
Раздел, упомянутый в сноске 1, перемещается в пункт 7.21.1 (3) в C11.

+0

Могу ли я спросить, с какого сайта у вас это есть? – Rizier123

+0

Тогда как насчет программного обеспечения, такого как sox (утилита comandline audio), которая поддерживает отправку аудиофайла из stdout? –

+1

Тем не менее, это ненормально (по крайней мере, на системах типа nix) для передачи двоичных данных через stdin/stdout - особенно в командных конвейерах, запущенных оболочкой для архивирования и/или сжатия/декомпрессии. – mah

0

Вы можете передавать исходные байты stdout с использованием fwrite() - или write(), с эквивалентным дескриптором файла для stdout. Так работают инструменты сжатия.

+2

Нет, 'fwrite()' не обрабатывает текстовый поток как двоичный. В системах, где это важно (Windows), использование 'fwrite()' для записи символа '' \ n'' в 'stdout' все равно приведет к записи' '\ r \ n" 'в файл. –

+0

Итак, вы говорите, что 'fwrite()' не может использоваться для записи буфера исходных байтов («двоичный») на стандартный вывод? –

+2

Нет, если 'stdout' в настоящее время находится в текстовом режиме (как и по умолчанию), а не если система делает значимое различие между текстом и двоичным кодом. Unix-подобных систем нет; текстовые и двоичные файлы и режимы обрабатываются одинаково. В Windows в текстовом режиме '' \ n'' переводится в пару CR-LF на выходе, и наоборот на входе, а Ctrl-Z обозначает конец файла; в двоичном режиме эти переводы не происходят. Другие системы могут иметь другие характеристики. –

1

stdout не обязательно должен быть текстовым потоком - как в случае перенаправления.

Так что, я думаю, ответ «да» на ваш второй вопрос.

Проверьте это - What is the simplest way to write to stdout in binary mode?

+1

Если по переадресации вы имеете в виду ' program_name> имя_файла', стандарт C все еще говорит, что 'stdout' является текстовым потоком при запуске программы. –

+0

да, вы правы - при запуске программы это текстовый поток - я думал, что вопрос был «нужен». По умолчанию stdout является текстовым потоком. Подобно fopen, который по умолчанию открывает текстовый поток, а не двоичный. То есть, это означает, что fopen требуется для обработки/обработки текстового потока - ответ - нет. Излишне добавлять, что именно так я интерпретировал «требуемый» в вопросе - возможно, R Sahu означал «по умолчанию» на моем языке. – Abhi