Перенос строки linux windows

одинаковый символ перевода строки для Windows и Linux

то в Windows в файл будет записано CR+LF, а в Linux будет записано LF.
Как задать в тексте программы, чтоб \n в строках интерпретировался при выводе в файл одинаково (либо CR+LF, либо LF по выбору) ?

А то получается что файлы в Windows и Linux побайтно не совпадают.

Неа. В Винде опять получишь CR+LF+CR

Попробуй юзать fstream, там, возможно этого не будет.

futures
> Если написать на С++
> fprintf(fp, «\n»);
Это не на С++, это на Си.
А на С++

std::ofstream fp; fp.open( "file.txt"); fp  "Hello futures"  0x0d  0x0a; // если использовать std::endl - то получится то же самое, что и с \n fp.close( );

При желании можно последовательность 0x0d,0x0a заменить функцией или макросом.

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»(с кавычками) и соответственно объявить макрос.

Источник

Этот день мы приближали, как могли — блокнот в Windows 10 стал понимать юниксовый перевод строки

Notepad в windows 10 начал понимать юниксовый перевод строки, а не только формат Windows.

С проблемой «каши» вместо удобочитаемого текста десятилетиями сталкивались те, кто пытался открыть в среде Windows текстовые документы, подготовленные на других операционных системах. Теперь же всё в одночасье изменяется. И это изменение столь же мало, сколь и эпично по своим практическим результатам и идеологическим последствиям. Microsoft вновь пытается играть в кросс-интеграцию и поддержку открытых стандартов.

Долгие годы Windows Блокнот мог нормально отображать только те текстовые документы, которые содержали символы начала новой строки в формате Windows End of Line (EOL) — «возврат каретки» (CR) и «подача на строку» (LF). На деле это приводило к тому, что Notepad не смог правильно отобразить содержимое текстовых файлов, созданных в Unix, Linux и macOS, где в качестве признака конца строки использовался только символ LF.

Например, вот скриншот Notepad, пытающегося отобразить содержимое текстового файла Linux .bashrc, который содержит только символы Unix LF EOL:

image

А вот скриншот недавно обновленного «Блокнота», отображающего содержимое того же самого файла UNIX / Linux .bashrc, но с правильными переносами:

image

Обратите внимание, что строка состояния указывает обнаруженный формат EOL текущего открытого файла.

Так же для гибкого управления новой возможностью в разделе реестра [HKEY_CURRENT_USER\Software\Microsoft\Notepad] вводятся два дополнительных ключа:

image

По накалу страстей спор о способе начала новой строки в электронных документах сравним со спором о пробелах и табуляциях в исходных текстах программ. У этого противостояния «за строку» было много причин, как лежащих в области древних стандартов и традиций, так и берущих свои корни в особенностях конструкции печатных машин и телетайпов. Не меньшую роль сыграло и стремление одних программистов буквально выполнять (интерпретировать) команды и управляющие символы, а других — следовать здравому смыслу.

Что мы можем узнать о проблеме из Википедии

Исторически на механических пишущих машинках был рычаг, который возвращал каретку к левому краю страницы и прокручивал вал, подвигая бумагу вверх на строку. На телетайпах и более поздних алфавитно-цифровых печатающих устройствах (АЦПУ) вместо каретки была головка, в лазерных принтерах она перестала быть материальной, но в термине возврат каретки всё это продолжали называть кареткой, чтобы его не менять. На телетайпах возврат каретки и подачу строки разделили, откуда традиция представления перевода строки как CR+LF перешла и к текстовым файлам.

Системы, основанные на ASCII или совместимом наборе символов, используют или LF (перевод строки, 0x0A), или CR (возврат каретки, 0x0D) по отдельности, или последовательность CR+LF. Эти названия основаны на командах принтера: перевод строки означает, что одна строка на бумаге должна быть перенесена при печати, а возврат каретки означает, что каретка печатающего устройства должна вернуться к началу текущей строки.

  • CR (ASCII 0x0D) использовался в 8-битовых машинах Commodore, машинах TRS-80, Apple II, системах Mac OS до версии 9 и OS-9;
  • LF (ASCII 0x0A) используется в Multics, UNIX, UNIX-подобных операционных системах (GNU/Linux, AIX, Xenix, Mac OS X, FreeBSD), BeOS, Amiga UNIX, RISC OS и других;
  • CR+LF (ASCII 0x0D 0x0A) используется в DEC RT-11 и большинстве других ранних не-UNIX- и не-IBM-систем, а также в CP/M, MP/M, MS-DOS, OS/2, Microsoft Windows, Symbian OS, протоколах Интернет.
  • LF (U+000A): англ. line feed — подача строки ;
  • CR (U+000D): англ. carriage return — возврат каретки ;
  • NEL (U+0085): англ. next line — переход на следующую строку;
  • LS (U+2028): англ. line separator — разделитель строк;
  • PS (U+2029): англ. paragraph separator — разделитель абзацев.

Но как известно, стандарты стандартами, а реализации у всех часто выходят разными. И масла в огонь подливает необходимость корректно отображать унаследованные документы, созданные до эпохи юникода. Отсутствие единого общепринятого представления перевода строки в разных операционных системах надолго осложнило обмен текстовыми данными между ними.

Юникод старается примирить эту разницу, уравнивая CR, LF и CR+LF, однако вступает в противоречие с наследуемым им ASCII при трактовке последовательности LF+CR, не предварённой CR: согласно ASCII это один перевод строки, а согласно Юникоду — два.

Источник

Как n и r обрабатываются по-разному в Linux и Windows?

Я думаю n двигает иглу вниз, и r перемещение стрелки в начало строки (выравнивание по левому краю)? Я не уверен, однако. Так что, если я ошибаюсь, пожалуйста, поправьте меня.

во всяком случае, мне сказали, что Windows и Linux обрабатывают newlines и carriage returns по-разному. Я хотел бы знать, как они справляются с ними по-разному и в некоторых местах, где важно помнить. Спасибо за ответ.

Количество просмотров материала

20.02.2023 8:39 3561

Распечатать страницу

3 ответа

Я думаю, что \ n перемещает иглу вниз, а \ r перемещает иглу в начало строки (выравнивание по левому краю)? Я не уверен, хотя

Это правда, более или менее, но в основном исторический курьез. Первоначально, перевод строки (LF) был использован для того чтобы выдвинуть бумагу одной линией на принтерах и стержнях печатной копии (телетайпов); возврат каретки (CR) возвратил печатающую головку в начало строки.

Это, вероятно, все еще работает на современных принтерах при использовании в «текстовом режиме», но в остальном не имеет большого значения сегодня.

во всяком случае, мне сказали, что Windows и Linux обрабатывают новые строки и каретку возвращается по-другому.

разница Просто: разработчики ОС должны были выбрать, как представить начало новой строки в тексте в компьютерных файлах. По различным историческим причинам в мире Unix/Linux в качестве маркера перевода строки был выбран один символ LF; MS-DOS выбрала CR+LF, а Windows унаследовала этот. Таким образом, разные платформы используют разные соглашения.

на практике, это становится все меньше и меньше проблем. Маркер новой строки действительно актуален только для погромов, которые обрабатывают «обычный текст», и их не так много — он в основном влияет только на исходный код программы, файлы конфигурации и некоторые простые текстовые файлы с документацией. В настоящее время большинство программ обработки этих видов файлов (Редакторы, компиляторы и т. д.) может обрабатывать оба соглашения о новой строке, поэтому это не имеет значения какой из них вы выберете.

есть некоторые случаи, когда инструменты настаивают на «своем» соглашении о новой строке (например, сценарии оболочки Unix не должны использовать CR+LF), и в этом случае вы должны использовать правильный.

CR и LF

американский стандартный код для обмена информацией (ASCII) определил управляющие символы, включая возврат каретки (CR) и перевод строки (LF), которые использовались (и все еще используются) для управления положением печати на принтерах способом, аналогичным механическим пишущим машинам, которые предшествовали ранним компьютерным принтерам.

зависимость от платформы

в Windows традиционную линию-разделитель в текстовых файлах следует КЛ ЛН

In старые (до OSX) системы Apple Macintosh традиционным разделителем строк в текстовых файлах был CR

в Unix и Linux традиционным разделителем строк в текстовых файлах является LF.

\n и \r

во многих языках программирования и сценариев \n означает «новая линия». Иногда (но не всегда) это означает символ перевода строки ASCII (LF), который, как вы говорите, перемещает курсор (или позицию печати) вниз на одну строку. В принтере или на пишущей машинке, можно бумага поднялась на одну строчку.

всегда \r означает символ возврата каретки ASCII (CR), название которого на самом деле происходит от механических пишущих машинок, где был ключ возврата каретки, из-за которого ролик («каретка»), который нес бумагу, чтобы двигаться вправо, питание от пружины, насколько это будет идти. Таким образом, устанавливаем текущую позицию набора текста на левое поле.

Программирование

в некоторых языках программирования \n может означать a зависящая от платформы последовательность символов, заканчивающихся или разделяющих строки в текстовом файле. Например в Perl, print «\n» создает другую последовательность символов в Linux, чем в Windows.

в Java, лучшая практика, если вы хотите использовать собственные окончания строк для платформы выполнения, не использовать \n или \r на всех. Вы должны использовать System.getProperty(«line.separator») . Вы должны использовать \n и \r где вы хотите LF и CR независимо от платформы (например, как используется в HTTP, FTP и других интернет коммуникационный протокол.)

действовать до его закрытия в Unix

в оболочке Unix stty команда может использоваться, чтобы заставить оболочку переводить между этими различными соглашениями. Например stty -onlcr заставит оболочку впоследствии перевести все исходящие LFs в CR LF.

Linux и OSX следуют соглашениям Unix

текстовые файлы

текстовые файлы по-прежнему чрезвычайно важны и широко используются. Например, HTML и XML примеры текстовый файл. Большинство важных интернет-протоколов, таких как HTTP, следуют соглашениям о текстовых файлах и содержат спецификации для окончаний строк.

принтеры

большинств принтеры за исключением очень самого дешевого, все еще уважают CR и LF. На самом деле они являются фундаментальными для наиболее широко используемых языков описания страниц — PCL и Postscript.

короче говоря, понадобилось для принтеров, но теперь операционки делают это немного иначе. В большинстве случаев можно просто сделать CR и LF, выполнив \r\n и в большинстве случаев, это будет работать нормально.

Источник

Читайте также:  Wine deb linux mint
Оцените статью
Adblock
detector