Почему char 0xA изменяется на 0xD + 0xA символов при записи его в файл с консолью? - PullRequest
1 голос
/ 24 марта 2020

Я использовал std::cout << (char)0xA в своем коде C ++.
Затем я записал в консоль myProgram.exe > file.txt.
Затем я открыл file.txt с помощью HEX-редактора и обнаружил 0D 0A вместо 0A.

ИДК, почему это произошло. Пожалуйста, помогите.

Скриншот HEX Editor (посмотрите на 0x82 и 0x19B)

Ответы [ 2 ]

3 голосов
/ 24 марта 2020

Добро пожаловать в магию c конца строк в ОС!

Язык C изначально был разработан для Unix систем, где конец строки был отмечен одним '\n' ( Код ASCII 0x0A) символ.

Когда он был перенесен в другие системы, было решено, что при взгляде программиста конец строки будет '\n', и что драйверы и стандартная библиотека преобразуют его в соответствующий конец строки, когда файл будет открыт в режиме text .

Это соглашение позднее было сохранено в C ++.

Поскольку Windows использует "\r\n" в качестве маркера конца строки, стандартная библиотека преобразует любые '\n' в пару "\r\n" (коды ASCII 0x0D и 0x0A).

3 голосов
/ 24 марта 2020

Стандарты C и C ++ указывают, что при открытии потока в текстовом режиме отправка ему \n будет выполнять все необходимые действия в целевой системе для перемещения файла на следующую строку. В системе Unix это просто означает вывод \n в файл. В некоторых основанных на записях системах это означает сброс текущей записи линейного вывода и переход к следующей. В MS-DOS и Windows это означает отправку \r и \n в поток.

Исторически, отправка \r в телетайп приведет к сбросу каретки на левый край, и отправка \n продвинет бумагу. Кто-то понял, что, хотя возможность сброса каретки без продвижения бумаги была полезной, \n продвигать бумагу без сброса каретки было гораздо меньше, и поэтому некоторые устройства реагировали на \n, продвигаясь к началу . следующей строки. MS-DOS, однако, предпочел хранить файлы таким образом, чтобы при выводе непосредственно на принтер, где \n переместился бы в текущее местоположение на следующей строке, нужно было бы отправлять оба значения \r. и \n, если кто-то хочет go до начала следующей строки.

...