- одинаковый символ перевода строки для Windows и Linux
- linux символ переноса строки
- Содержание
- Терминология
- Способы представления
- Конвертирование
- Ссылки
- Перенос строки в текстовых файлах — какие бывают варианты. Что такое каретка. Обозначения символов. Разные операционные системы
- Primary tabs
- Forums:
- Что такое каретка
- Какие символы используются
- Какие есть варианты использования
- Почему важно всегда ставить символ переноса строки в конце текстовых файлов?
- Что такое символ переноса строки?
- Почему перенос строки в конце файла важен?
- Ещё доводы:
- Настраиваем редактор
- Заключение
одинаковый символ перевода строки для Windows и Linux
Если написать на С++
то в Windows в файл будет записано CR+LF, а в Linux будет записано LF.
Как задать в тексте программы, чтоб \n в строках интерпретировался при выводе в файл одинаково (либо CR+LF, либо LF по выбору) ?
А то получается что файлы в Windows и Linux побайтно не совпадают.
Неа. В Винде опять получишь CR+LF+CR
Попробуй юзать fstream, там, возможно этого не будет.
futures
> Если написать на С++
> fprintf(fp, «\n»);
Это не на С++, это на Си.
А на С++
std::endl не поможет случаем?
Какой-то ужас.
Достаточно просто указать в fopen режим «wb».
Ответ уже дали:
flatz> Достаточно просто указать в fopen режим «wb».
>> std::ofstream fp;
>> fp.open(«file.txt»);
>> fp
>> fp.close();
я понимаю, что можно просто вместо \n прописать свою константу и ее уже выводить как один или два символа, но в таком случае:
1) теряется наглядность, если в строке много чего выводится, то намного удобнее чтоб там был просто вывод \n
2) уже есть куча написанного кода просто с \n, теперь придется вручную его изменять.
>> Достаточно просто указать в fopen режим «wb».
ну про бинарный режим открытия файла я понимаю, но тогда в Windows вместо \n будет записан только LF, и большинство виндовс-программ не будут его нормально открывать, что очень неудобно (ну или нужно лазить по всей программе и заменять всюду \n на \r\n).
Вообще то я склоняюсь к тому, чтоб и в Виндовс и в Линукс мне будет удобнее заменять \n на CR+LF, только вот как автоматизировать этот процесс, чтоб не менять все в тексте программы, а раз задать константу?
А может можно как-то переопределить std::endl на то, что мне нужно(либо CR+LF, либо LF по выбору )?
futures
> но тогда в Windows вместо \n будет записан только LF, и большинство
> виндовс-программ не будут его нормально открывать
Ну а \n\r туда записать конечно же по каким-то причинам уже нельзя.
futures
Ты все-таки определись, что именно тебе нужно — бинарная совместимость файлов или то, чтобы в каждой из ОС соблюдался именно ее стандарт на завершение строки.
Одновременно выполнить эти два условия совершенно невозможно.
мне однозначно нужна бинарная совместимость файла, а соблюдать одновременно два формата я и не планировал, мне просто нужно простой метод переключения между форматами без ручного изменения кучи строчек исходного кода.
futures
>>мне однозначно нужна бинарная совместимость файла
Зачем нужна бинарная совместимость, если файл будет редактироваться ручками ?
futures
> Как задать в тексте программы, чтоб \n в строках интерпретировался при выводе в
> файл одинаково
Поставить флаг, что файл бинарный «fopen(«. «, «wb»)». Это выключит любую самодеятельность.
> большинство виндовс-программ не будут его нормально открывать
Кроме блокнота таких не замечено.
> только вот как автоматизировать этот процесс, чтоб не менять все в тексте
> программы, а раз задать константу?
Заменить \n на «NEW_LINE»(с кавычками) и соответственно объявить макрос.
linux символ переноса строки
Содержание
Перевод строки, или разрыв строки — продолжение печати текста с новой строки, то есть с левого края на строку ниже, или уже на следующей странице.
Терминология
Способы представления
Способ представления перевода строки в текстовом файле часто зависит от используемой операционной системы:
Конвертирование
Способы конвертирования файла:
Файл → Сохранить как… → Конец строки → …
Ссылки
© 2012 Ubuntu-ru — Русскоязычное сообщество Ubuntu Linux.
© 2012 Canonical Ltd. Ubuntu и Canonical являются зарегистрированными торговыми знаками Canonical Ltd.
В более-менее продвинутых текстовых редакторах (Akelpad, Sublime text, Notepad++ и т.п.) обычно можно выбирать символ конца строки.
А по поводу генерации текстового файла средствами PHP — смотря как именно туда записываете конец строки. Если константой PHP_EOL — то будет на линуксе LF, на винде CRLF. А если вручную ставить символы конца строки — то какие запишете, те и будут.
Ещё одна тривиальная задача, но, как выяснилось, не всем известно её решение. Итак, сегодня мы поговорим о переводе строки в Linux. Есть *nix, на который мы wget-ом, например, вытащили текстовик (конфигурационный файл, скрипт…), созданный на компьютере под управлением Windows. Дело в том, что в Windows системах перенос строки обозначается двумя символами — CR и LF, а в Linux-е только CR (возврат каретки). Соответственно, файл в терминале будет выглядеть примерно так:
Вот эти ^M в конце каждой строки — это и есть лишний символ, доставшийся нам от Windows. В случае с CSS — ничего страшного не случится, но если это стартовый скрипт, например, из статьи про SSHGuard — работать он не будет. Для того, чтобы исправить ситуацию существует множество решений, конечно, но с моей точки зрения есть два наиболее изящных. Первое решение подойдёт тем, у кого на Linux-машине установлен интерпретатор Perl. Вот он:
perl -pi -e ‘s/
/
/;’ filename
Второй же вариант реализуется исключительно средствами командной оболочки bash:
cat filename.in | col -b > filename.out
Оба варианта работоспособны полностью, но я предпочитаю второй, так как он оставляет нетронутым оригинальный файл на случай, если что-то пойдёт не так.
Перенос строки в текстовых файлах — какие бывают варианты. Что такое каретка. Обозначения символов. Разные операционные системы
Primary tabs
Forums:
Что такое каретка
Под кареткой можно подразумевать курсор (метку), который перемещается по экрану, когда мы набираем текстовй файлы.
Какие символы используются
Для переноса строки могут в общем случае использоваться два символа:
- Переноса строки (= «Перенос каретки«)
Обозначают символами: - Возврата строки (= «Возврат каретки«)
Обозначают символами:
Какие есть варианты использования
- Всё наиболее «логично» в Windows (и ряде других систем) — здесь в качестве переноса строки программы обычно используют последовательность:
— то есть сначала мы сначала возвращаем курсор в начало строки, а потом уже переносим его на новую строчку, так что он оказывается на новой строке в крайне левом положении. (Ведь по сути именно так представляется работа клавиши Энтер при наборе текста)
LF
CR
Почему важно всегда ставить символ переноса строки в конце текстовых файлов?
Иногда при просмотре диффов коммитов через git log или git diff можно заметить следующий вывод:
Или на GitHub в интерфейсе для просмотра диффов:
Почему это так важно, что Git и GitHub предупреждают нас об этом? Давайте разберемся.
Что такое символ переноса строки?
Что может быть проще, чем текстовый файл? Просто текстовые данные — как хранятся на диске, так и отображаются. На самом деле правительство нам врёт всё немного сложнее.
Оффтопик про управляющие символы ASCII
Не все символы, которые содержатся в текстовых файлах, имеют визуальное представление. Такие символы ещё называют «управляющими», и к ним относятся, например:
- нулевой символ ( x00 , \0 ) — часто используется для кодирования конца строки в памяти; т.е. программа считывает символы из памяти по одному до тех пор, пока не встретит нулевой символ, и тогда строка считается завершённой;
- табуляция ( \x09 , \t ) — используется для выравнивания данных по границе столбца, так что это выглядит как таблица;
- перевод строки ( \x0a , \n ) — используется для разделения текстовых данных на отдельные строки;
- возврат каретки ( \x0d , \r ) — переместить курсор в начало строки;
- возврат на один символ ( \x08 , \b ) — переместить курсор на один символ назад;
- звонок ( \x07 , \a ) — если набрать этот символ в терминале, то будет бибикающий символ; именно так консольные программы, типа vim , бибикают на пользователей;
- и другие.
Многие эти символы пришли к нам из эпохи печатных машинок, поэтому у них такие странные названия. И действительно, в контексте печатной машинки или принтера такие операции, как перевод строки (сместить лист бумаги вверх так, чтобы печатающая головка попала на следующую строку), возврат каретки (переместить печатающую головку в крайнее левое положение) и возврат на один символ назад, обретают смысл. При помощи возврата на один символ назад создавались жирные символы (печатаешь символ, возвращаешься назад и печатаешь его ещё раз) и буквы с диакритическими знаками, такие как à или ã (печатаешь символ, возвращаешься назад и печатаешь апостроф или тильду). Но зачем печатной машинке бибикалка?
Сегодня многие из этих символов потеряли смысл, но некоторые до сих пор выполняют функцию, схожую с исходной.
Текстовые редакторы отображают текстовые файлы в некоем адаптированном виде, преобразуя непечатаемые символы, например, переносы строк и табуляции преобразуются в настоящие отдельные строки или выравнивающие отступы.
Для набора символа переноса строки достаточно нажать клавишу «Enter», но на разных платформах этот символ закодируется по-разному:
- в Unix-совместимых системах (включая современные версии macOS) используется один символ перевода строки ( LF );
- в Windows используется сразу два символа — возврат каретки ( CR ) и перевод строки ( LF );
- в очень старых версиях Mac OS (до 2001 года) использовался один символ CR .
Как видите, Windows точнее всего эмулирует поведение печатной машинки.
В языках программирования символ новой строки часто кодируют при помощи бэкслэш-последовательностей, таких как \n или \r\n . Нужно понимать разницу между такой последовательностью и настоящим символом переноса строки. Если в редакторе в файле *.txt просто набрать \n и сохранить, то вы получите ровно то, что написали. Символом переноса строки оно не станет. Нужно что-то, что заменит эти бэкслэш-последовательности на настоящие символы переноса строки (например, компилятор или интерпретатор языка программирования).
Почему перенос строки в конце файла важен?
Согласно определению из стандарта POSIX, который тоже пришёл к нам из эпохи печатных машинок:
Строка — это последовательность из нуля или более символов, не являющихся символом новой строки, и терминирующего символа новой строки.
Почему важен этот стандарт? Возможен миллиард способов реализовать одно и то же, и только благодаря стандартам, таким как POSIX, мы имеем сейчас огромное количество качественного ПО, которое не конфликтует друг с другом.
Т.е. если вы не ставите символ переноса строки в конце строки, то формально по стандарту такая строка не является валидной. Множество утилит из Unix, которыми я пользуюсь каждый день, написано в согласии с этим стандартом, и они просто не могут правильно обрабатывать такие «сломанные» строки.
Давайте, например, через Python создадим такой файл со сломанными строками:
Сколько по-вашему в этом файле строк? Три? Давайте посмотрим, что об этом файле думает утилита wc , которая с флагом -l умеет считать количество строк в файле:
Упс! wc нашла только 2 строки!
Давайте создадим еще один файл:
И попробуем теперь склеить два созданных файла при помощи утилиты cat :
Название cat — это сокращение от «конкатенация», и никак не связано с котиками. А жаль.
И опять какой-то странный результат! В большинстве случаев это не то, чего вы бы ожидали, но вполне возможны ситуации, когда вам нужен именно такой результат. Именно поэтому утилита cat не может самостоятельно вставлять отсутствующие символы переноса строки, иначе это сделало бы её поведение неконсистентным.
Это только пара примеров, но многие другие утилиты, которые работают с текстом (например, diff , grep , sed ), имеют такие же проблемы. Собственно говоря, это даже не проблемы, а их задокументированное поведение.
Ещё доводы:
- при дозаписи содержимого в конец файла без переноса строки получится некрасивый дифф — будет изменена последняя строка (хотя на ней всего лишь добавился символ переноса);
- файл с переносом строки и без переноса строки — это два разных файла; для diff и git diff единственный способ отобразить разницу между ними — это напечатать сообщение об отсутствии символа переноса строки;
- согласно стандарту языка C (до 2014 года), непустые файлы с исходным кодом должны заканчиваться символом переноса строки.
Настраиваем редактор
Самый простой способ перестать думать о пустых строках и начать жить — это настроить свой текстовый редактор или IDE на автоматическое добавление символа переноса строки в конец файлов:
- PyCharm и другие IDE JetBrains: Settings > Editor > General > Ensure an empty line at the end of a file on Save ;
- VS Code: «files.insertFinalNewline»: true .
Для других редакторов смотрите настройку здесь.
Кстати, если вы пользуетесь форматтером black , то у меня хорошие новости — он всегда добавляет перенос строки в конец всех файлов *.py .
Заключение
Возможно, такая маленькая деталь, как перенос строки в конце файла и не кажется очень важной, а тема вообще кажется спорной, но боюсь, что у нас нет другого выбора, кроме как принять это правило за данность и просто выработать привычку (или настроить инструментарий) всегда ставить символ новой строки в любых текстовых файлах, даже если этого не требуется явно. Это считается распространённой хорошей практикой, и как минимум убережёт вас и ваших коллег от всяких неожиданных эффектов при работе с утилитами Unix.
В текстовом редакторе это выглядит как лишняя пустая строка в конце файла: