Теперь разделитель строк зависит от системы, но в то время как в программе ac я использую '\n' для разделителя строк, он отлично работает, независимо от того, запускаю ли я его в windows или linux. Зачем??
В java мы должны использовать% n, поскольку он зависит от системы, но почему мы используем '\n' в c для новой строки независимо от os, в которой мы ее запускаем?
Вот какой стандарт C99 должен сказать об этом:
5.2.2 Character display semantics
[...]
2. Alphabetic escape sequences representing nongraphic characters in the execution
character set are intended to produce actions on display devices as follows:
[...]
\n (new line) Moves the active position to the initial position of the next line.
Это означает, что если вы печатаете "\n", его нужно заменить на "\ r\n" на окнах, чтобы выполнить это требование. Но это определяется только таким образом для устройств отображения, а не для файлов. Однако нет спецификации того, как этот символ (или любой другой пробел) должен быть представлен в текстовом файле:
5.2.2 Character display semantics
[...]
3. Each of these escape sequences shall produce a unique implementation-defined value
which can be stored in a single char object. The external representations in a text file
need not be identical to the internal representations, and are outside the scope of this
International Standard.
Поэтому прямой ответ на ваш вопрос - он работает так, как вы ожидали бы, потому что стандарт C ничего не говорит о двоичном представлении символа \n
когда он печатается на устройстве отображения или сохраняется в текстовом файле. Однако он точно определяет, как он должен себя вести при печати - он должен перейти в начало следующей строки.
В программах на C вы указываете, когда вы открываете файл, будь то текстовый или двоичный, - когда вы открываете файл с fopen
, вы указываете строку режима, которая включает b
если это двоичный файл. При чтении и записи в текстовые файлы библиотека C автоматически преобразует символы '\n'
и разделитель системной строки.
В java нет аналогичного "текстового режима", который автоматически переводится для вас, поэтому для работы с разделителями строк вам нужно сделать это явно в коде.
\n\r
для новой строки (+ возврат каретки).\r
легко игнорируется, потому что это непечатный символ\n
переводится в машинную версию «новой строки», необязательно 0x0A.