2016-08-31 4 views
3

В C мы имеем пару общих управляющих последовательностей:последовательность для истинного Linefeed (LF)

\r для возврата каретки (CR) - который был бы эквивалентом делать '\015'

\n часто описанный как LineFeed, но я понимаю, что '\ n' будет переведен в строку, как требуется для CRLF (в зависимости от ОС), что будет эквивалентно выполнению "\015\012". В частности, если я донг printf или fprintf.

Есть ли код эвакуации для истинного символа перевода строки, который не будет переведен, или я застрял, используя '\012', когда я не хочу, чтобы это перевести?

ответ

3

no перевод в компиляторе С. Строка [и они эквивалентны]:

// (1) these are all equivalent to a string of newline of length 1: 
"\n" 
"\x0a" 
"\012" 

// (2) these are all equivalent to a string of carriage return of length 1: 
"\r" 
"\x0d" 
"\015" 

// (3) these are all equivalent to a string of CRLF of length 2: 
"\r\n" 
"\x0d\0x0a" 
"\015\012" 

При выводе на терминал по системе POSIX, драйвер телетайпа будет преобразовывать случай (1) в CRLF в приготовленном режиме. Это можно изменить с помощью некоторых вызовов TTY ioctl. IIRC, аналогичный для окон (?). Но, [снова] IIRC, в окнах есть специальный вызов для Windows, который должен быть выполнен, потому что перевод выполняется на очень низком уровне.

При записи в файл в системе POSIX перевод не выполняется.

Однако при записи в файл под Windows, случай (1) переводится в ОС CRLF для нормальной открывается [потому что по умолчанию режим «текст»]:

open(file,O_WRONLY); 
fopen(file,"w"); 

Чтобы подавить перевод под окнами для случая (1), откройте файл в режиме «бинарного»:

open(file,O_WRONLY | O_BINARY); 
fopen(file,"wb"); 

двоичный режим также применяется для открытия в режиме чтения. И для POSIX это [эффективно] нет-op и игнорируется. С/без двоичной опции под POSIX открывается в двоичном режиме, потому что POSIX имеет no «текстовый режим» для файлов.

Таким образом, для переносимости между POSIX/окнами это режим, используемый для подавления перевода.

4

@Barmar является правильным: \n и \012 - это точные биты. Разница между простым LF и CRLF на машинах Windows заключается в том, как вы открываете любое устройство, на которое вы пишете. Если вы делаете printf на терминал под cygwin, вы можете, например, выбрать stty, чтобы перейти в необработанный режим. В противном случае это будет зависеть от специфики используемой библиотеки C.

Редактировать Для Win32 с помощью MSVCRT, используя fopen(..., "b") «переводы, связанные с возвратом каретки и символы перевода строки подавляются» (от MSDN). Напротив, в текстовом режиме «символы перевода строки переводятся в кавычки возвратно-линейных комбинаций на выходе» (тот же источник).

Чтобы ответить на исходный вопрос, нет единственной escape-последовательности, которая всегда будет \012 на выходе, на каждой платформе, с каждой выходной процедурой.

2

История:

Старые мэйнфреймы были терминалы соединены через часто медленные соединения. Терминалы были пишущими машинами. После того, как пользователь набрал строку, они нажали кнопку возврата (как на старых пишущих машинах). Это был сигнал для мэйнфрейма для обработки линии. Как только мейнфрейм получил и обработал линию, он отправил строку. Бумага пишущей машинки теперь поднялась на одну строку, сообщив пользователю, что система готова принять еще одну строку.

Unix, основанный на разборке, скопировал это поведение.

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

для Windows, не будучи Мультисобственность, просто поместите CR и LF в файл.

+0

Ты мужчина после моего собственного сердца. И, я готов поспорить, вы описываете IBM/370 (эру) вместе с терминалом 2741 [по существу, выборкой IBM со скользящей бумагой для подачи звездочек]. Кроме того, для TTY-типа с телексным типом (например, ASR-33) они были ориентированы на характер, но просто слепя следовали за CR или LF. Печать с помощью только CR несколько раз (с разным blah) сделала overstrike и использовалась, чтобы заслонять пароль, который будет введен для входа в систему, поскольку не было подавления эха введенного текста –

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