Символ новой строки в языке c и java

1

Теперь разделитель строк зависит от системы, но в то время как в программе ac я использую '\n' для разделителя строк, он отлично работает, независимо от того, запускаю ли я его в windows или linux. Зачем??

В java мы должны использовать% n, поскольку он зависит от системы, но почему мы используем '\n' в c для новой строки независимо от os, в которой мы ее запускаем?

  • 0
    Windows использует \n\r для новой строки (+ возврат каретки). \r легко игнорируется, потому что это непечатный символ
  • 3
    Во-первых, Java всегда использует набор символов Unicode, даже на машинах EBCDIC, так что никаких проблем нет. А для C / C ++ \n переводится в машинную версию «новой строки», необязательно 0x0A.
Показать ещё 3 комментария
Теги:
printf

2 ответа

1
Лучший ответ

Вот какой стандарт 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 когда он печатается на устройстве отображения или сохраняется в текстовом файле. Однако он точно определяет, как он должен себя вести при печати - он должен перейти в начало следующей строки.

  • 0
    Пожалуйста, дайте ссылку, чтобы проверить ответ
  • 0
    @BreakingBenjamin: спецификацию ISO легко найти в Интернете. Я добавил ссылку и добавил номера разделов в вопрос.
0

В программах на C вы указываете, когда вы открываете файл, будь то текстовый или двоичный, - когда вы открываете файл с fopen, вы указываете строку режима, которая включает b если это двоичный файл. При чтении и записи в текстовые файлы библиотека C автоматически преобразует символы '\n' и разделитель системной строки.

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

  • 0
    Определенно есть разница между вводом текста и двоичных файлов в Java. Они используют разные классы.
  • 0
    @HotLicks: это разные менеджеры ввода / вывода - они разделяют базовые объекты File, которые не различают текстовые и двоичные файлы и могут использоваться для обоих. Я думаю, что было бы возможно для Java, чтобы указать перевод строки-терминатора при использовании текстового ввода-вывода, но они этого не сделали.
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню