Является ли \ n мультисимвольным в C? - PullRequest
6 голосов
/ 09 сентября 2010

Я прочитал, что \ n состоит из CR & LF.Каждый из них имеет свои собственные коды ASCII.

Значит, \ n в C представлен одним символом или он состоит из нескольких символов?

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

Ответы [ 9 ]

20 голосов
/ 09 сентября 2010

В программе на Си это один символ, '\n', представляющий конец строки. Тем не менее, некоторые операционные системы (особенно Microsoft Windows) используют два символа для представления конца строки в текстовых файлах, и это, вероятно, является причиной путаницы.

Функции C I / O несут ответственность за преобразование между представлением C '\n' и всем, что использует ОС.

В программах на C просто используйте '\n'. Это гарантированно будет правильным. При просмотре текстовых файлов с помощью какого-либо редактора вы можете увидеть два символа. Когда текстовый файл переносится из Windows в какую-либо систему на основе Unix, вы можете получить "^M", отображаемый в конце каждой строки, что раздражает, но не имеет ничего общего с C.

8 голосов
/ 09 сентября 2010

Обычно: '\n' - это один символ, представляющий новую строку.'\r' - это один символ, представляющий возврат каретки.Они являются собственными независимыми символами ASCII.

Проблемы возникают потому, что в реальном представлении файлов системы на основе UNIX обычно используют только '\n' для представления того, что вы думаете, когда нажимаете «ввод» или «возврат».на клавиатуре, тогда как Windows использует '\r', сопровождаемый непосредственно '\n'.

В файле:

"This is my UNIX file\nwhich spans two lines"
"This is my Windows file\r\nwhich spans two lines"

Конечно, как и все двоичные данные, все эти символы относятся к интерпретации, и эта интерпретация зависит от приложения, использующего данные. Придерживайтесь '\ n', когда создаете C-строки , если только вы не хотите буквального возврата каретки, потому что, как отмечали люди в комментариях, представление ОС вас не касается.Библиотеки ввода-вывода, включая C, должны обрабатывать это сами и абстрагироваться от вас.

Для вашего любопытства, в десятичном виде, '\n' в ASCII равно 10, '\r' равно 13, но обратите внимание, что этоявляется стандартом ASCII, а не стандартом C.

6 голосов
/ 09 сентября 2010

Это зависит от:

  • '\n' - это один символ (ASCII LF)
  • "\n" - это символ '\n', за которым следует терминатор 0

некоторые операции ввода / вывода преобразуют '\n' в '\r\n' в некоторых системах (CR-LF).

4 голосов
/ 09 сентября 2010

Когда вы печатаете \n в файл, используя библиотеки Windows C stdio, библиотека интерпретирует это как логическую новую строку, а не буквальный символ 0x0A.Выходными данными в файл будет версия новой строки для Windows: 0x0D0A (\r\n).

Запись

Пример кода:

#include <stdio.h>
int main() {
    FILE *f = fopen("foo.txt","w");
    fprintf(f,"foo\nbar");
    return 0;
}

Быстрый cl /EHsc foo.c позже, и вы получите

0x666F6F 0x0D0A 0x626172 (separated for convenience)

в файле foo.txt в шестнадцатеричном редакторе.

Важно отметить, что этот перевод НЕ происходит, еслиВы пишете в файл в «двоичном режиме».

Чтение

Если вы читаете файл обратно, используя те же инструменты, также в Windows, "Windows EOL "будет интерпретироваться правильно, если вы попытаетесь сравнить с \n.

При чтении обратно

#include <stdio.h>
int main() {
    FILE *f = fopen("foo.txt", "r");
    char c;
    while (EOF != fscanf(f, "%c", &c))
        printf("%x-", c);
}

Вы получаете

 66-6f-6f-a-62-61-72-

Следовательно, единственный раз, когда это должно относиться к вам, это если вы

  • Перемещение файлов назад и вперед между Mac / Unix и Windows.Unix здесь не нуждается в реальном объяснении, поскольку \n прямо переводится как 0x0A на этих платформах.(pre-OSX \n было 0x0D на Mac iirc)
  • Помещая текст в двоичные файлы, только делайте это осторожно, пожалуйста
  • Пытаясь выяснить, почему ваши двоичные данные испорченыкогда вы открываете файл "w" вместо "wb"
  • Оценивая что-то важное на основе размера файла, в Windows у вас будет дополнительный байт на новую строку.
3 голосов
/ 09 сентября 2010

Согласно стандарту C99 (раздел 5.2.2),

\ n"перемещает активную позицию [где появится следующий символ из fputc] в начальную позицию на следующей строке".

Также

[ \ n ] должен генерировать уникальное значение, определяемое реализацией который может храниться в одном объекте char. Внешние представления в текстовом файле не обязательно должны быть идентичны внутренним представлениям и выходят за рамки [стандарта C99]

Большинство реализаций C предпочитают определять \n как перевод строки ASCII (0x0A) по историческим причинам. Однако во многих компьютерных операционных системах последовательность перемещения активной позиции в начало следующей строки требует двух символов, обычно 0x0D, 0x0A. Таким образом, при записи в текстовый файл реализация C должна преобразовать внутреннюю последовательность 0x0A во внешнюю последовательность 0x0D, 0x0A. Как это сделать, выходит за рамки стандарта C, но обычно библиотека ввода-вывода файлов выполняет преобразование для любого файла, открытого в текстовом режиме.

3 голосов
/ 09 сентября 2010

\n - это новая строка - это логическое представление того, что отделяет одну строку от другой в текстовом файле.

Данная платформа будет иметь некоторое физическое представление этого логического разделения между строками. В Unix и большинстве подобных систем новая строка представляется символом перевода строки (LF) (а поскольку Unix был / очень тесно связан с C, в Unix LF часто просто называют новой строкой). В MacOS он обычно представлен возвратом каретки (CR). На значительном числе других систем, особенно Windows, она представлена ​​парой возврата каретки / перевода строки - обычно в таком порядке, хотя время от времени вы видите, что что-то использует LF, а затем CR (как я помню, Clarion раньше сделай это).

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

2 голосов
/ 09 сентября 2010

Ваш вопрос касается текстовых файлов.

A текстовый файл представляет собой последовательность строк.
строка - это последовательность символов, заканчивающаяся (включая) разрывом строки.
разрывы строк по-разному представлены различными операционными системами.

В Unix / Linux / Mac они обычно представлены одним LINEFEED
В Windows они обычно представлены парой ВОЗВРАТ КАРЬЕРЫ + LINEFEED
На старых Mac они обычно представлялись одним ВОЗВРАТОМ CARRIAGE
В других системах (AS / 400 ??) может даже не быть специального символа, представляющего разрыв строки ...

В любом случае, код библиотеки в C отвечает за перевод системного перевода строки в '\n' при чтении текстовых файлов и выполнение обратной операции при записи текстовых файлов .

Таким образом, независимо от того, каково представление в любой данной системе, когда вы читаете текстовый файл в C, строки заканчиваются на '\n'.

Примечание: '\n' не обязательно 0x0a во всех системах.

0 голосов
/ 09 сентября 2010

Это один символ. Он представляет Newline (но не единственное представление - Wikipedia ).

РЕДАКТИРОВАТЬ: вопрос был изменен, когда я печатал ответ.

0 голосов
/ 09 сентября 2010

Да, это так.

\n - перевод строки. Шестнадцатеричный код 0x0A.

\r - возврат каретки. Шестнадцатеричный код 0x0D

...