Требуется ли возврат каретки при печати на консоли в Windows? - PullRequest
2 голосов
/ 08 апреля 2009

Кажется, достаточно просто поставить перевод строки, но я знаю, что это должен быть возврат каретки + перевод строки. Случится ли что-нибудь ужасное, если вы не поставите возврат каретки и используете только перевод строки?

Это в ANSI C и не будет перенаправлено в файл или что-либо еще. Просто обычное консольное приложение.

Ответы [ 5 ]

2 голосов
/ 08 апреля 2009

Консоль Windows следует тому же соглашению об окончании строки, которое предполагается для файлов или, в этом отношении, для реальных физических терминалов. Для правильного перехода к следующей строке необходимо видеть и CR, и LF.

Тем не менее, существует много программной инфраструктуры между программой ANSI C и этой консолью. В частности, любая стандартная функция ввода-вывода библиотеки C попытается сделать правильные вещи, предполагая, что у вас есть такая возможность. Вот почему были определены модификаторы fopen() * t и b для параметра mode.

При t (по умолчанию для большинства потоков и, в частности, для stdin и stdout), тогда любой напечатанный \n преобразуется в последовательность CRLF, и для чтения происходит обратное. Чтобы отключить это поведение, используйте модификатор b.

Между прочим, терминалы, традиционно подключенные к * nix-блокам, включая DEC VT100, эмулируемый XTerm, также нуждаются как в CR, так и в LF. Однако в мире * nix преобразование символа новой строки в последовательность CRLF обрабатывается драйвером устройства tty, поэтому большинству программ об этом не нужно знать, а модификаторы t и b оба игнорируются. , На этих платформах, если вам нужно отправлять и получать символы на tty без этой модификации, вам нужно искать stty (1) или системные вызовы, от которых это зависит.

Если ваша другая программа ANSI C избегает ввода-вывода библиотеки C на консоль (возможно, из-за того, что вам нужен доступ к цвету символа консоли и другим атрибутам), то будет ли вам отправлять CR или нет, будет зависеть от того, какие вызовы Win32 API вы используете для отправки символов.

1 голос
/ 08 апреля 2009

Если вы находитесь в среде * nix \ n (перевод строки), возможно, все в порядке. Если вы находитесь в Windows и не перенаправляете (сейчас) перевод строки, это тоже нормально, но если кто-то в какой-то момент перенаправляет: - (

Если вы работаете в Windows, могут возникнуть проблемы, если выходные данные перенаправляются в текстовый файл, а затем другой процесс пытается использовать данные.

Консоль знает, что показывать, но потребители могут быть недовольны ...

Если вы используете C #, вы можете попробовать Environment.NewLine "constant".

http://msdn.microsoft.com/en-us/library/system.environment.newline.aspx

Если вы действительно в Vanilla C, вы застряли с \ r \ n. : -)

0 голосов
/ 08 апреля 2009

В C файлы (называемые «потоками») бывают двух видов - двоичные или текстовые.

Значение этого различия остается зависимым от реализации / платформы, но в Windows (с общими реализациями, которые я видел) при записи в текстовые потоки '\ n' автоматически переводится в "\ r \ n", а когда чтение из текстовых потоков "\ r \ n" автоматически переводится в '\ n'.

«Консоль» на самом деле является «стандартным выводом», то есть потоком, открытым по умолчанию в виде текстового потока. Таким образом, на практике в Windows достаточно написать «Hello, world! \ N» - и переносимо.

0 голосов
/ 08 апреля 2009

Я не пробовал так долго, что не уверен, что помню, что происходит ... но разве перевод строки не перемещается вниз по строке, не возвращаясь к левому столбцу?

В зависимости от вашего компилятора стандартный вывод может быть открыт в текстовом режиме, и в этом случае один перевод строки будет переведен в \ r \ n перед записью.

Редактировать: Я только что попробовал быстрый тест, и в XP файл без возвратов отображается нормально. Я до сих пор не знаю, будут ли какие-либо компиляторы вставлять возвращаемые значения для вас.

0 голосов
/ 08 апреля 2009

Это зависит от того, для чего вы их используете. Некоторые программы не будут отображать новые строки должным образом, если вы не указали \r и \n.

Если вы попытаетесь написать только \n, некоторые программы, использующие ваш текстовый файл (или вывод), могут отображать ваш текст в виде одной строки вместо нескольких строк.

Существуют также некоторые форматы файлов и протоколы, которые будут полностью недействительными без использования \r и \n.

...