1

Кто-то недавно прислал мне пару файлов исходного кода .cpp . Открыв файлы с помощью GNU Emacs или GVIM, я обнаружил, что у них есть странный символ ^M в конце каждой строки.

Вот скриншот, показывающий, что я имею в виду Скриншот редактора

Когда я открываю те же исходные файлы с помощью Gedit, я не вижу эти символы ^M Что я должен делать? Здесь много рассматриваемых файлов, поэтому открытие и выполнение операции поиска-замены путем замены на пустую строку выглядит как непосильная операция.

Как ни странно, эти файлы компилируются чисто, когда я компилирую с GCC. Что здесь происходит. Что я должен делать?

4 ответа4

6

В Unix символ новой строки - \n а в Windows - \r\n . \r или ^M - символ возврата каретки.

Если файл написан в редакторе в режиме Windows, каждый символ новой строки будет иметь символ возврата каретки. Если вы скажете своему редактору (и если он понимает) обрабатывать символы новой строки, как в Windows, вы больше не увидите символы ^M

Кроме того, вы можете запустить dos2unix на своей базе кода, чтобы решить эту проблему.

И, как вы правильно заметили, вы не увидите никаких проблем при компиляции, потому что это не какой-то дополнительный специальный символ в коде, а просто несоответствие между интерпретацией символов новой строки в Windows и Linux.

1

У вас есть исходный файл со смешанными окончаниями строк Windows и UNIX. В то время как UNIX просто использовал перевод строки (иногда отображается как ^ J), Windows использует возврат каретки + перевод строки (иногда отображается как ^ M ^ J). Ваш редактор видит строки UNIX и говорит "это должен быть файл UNIX", но затем видит разбросанные окончания строк Windows и говорит: «Это специальный символ, я должен показать его».

Вы можете попытаться преобразовать файл так или иначе. Вы можете попробовать использовать команду dos2unix для преобразования в окончания строк UNIX. Это будет работать на стороне UNIX, но ваша сторона Windows будет сбита с толку, если вы не получите редактор Windows, который знает окончания UNIX.

Или вы можете использовать unix2dos и сделать все это для Windows. Если вы согласны со всем файлом, ваши редакторы UNIX (которые, как правило, знают окончания Windows лучше, чем редакторы Windows, знают окончания UNIX) должны быть в порядке. В этот конкретный момент emacs/gvim был просто сбит с толку, потому что файл был несовместим.

Как вы уже видели, компилятору не важно, что такое конец строки.

0

Согласно этому ресурсу, ^M - это возврат каретки - вот почему вы можете аккуратно скомпилировать с помощью GCC.

0

Причина, по которой вы видите их в emacs/vim, заключается в том, как они читают вещи / как они кодируются. ^M на самом деле просто Carriage Return (нажатие кнопки ввода).

В любом случае, вы можете попробовать выполнить (в vim, так как я не знаю соответствующей команды в Emacs) :set ff=unix , а затем :w , что должно преобразовать его в формат Unix и избавиться от него в следующий раз, когда вы откройте его (iirc).

Или, если вы хотите явно удалить ^M из документа, выполните поиск / замену (в Vim, поскольку я знаю только это) на :%s/<ctrl + v><ctrl + m>//gc .

( Эта ссылка показывает вам команды о том, как сделать S/R для возвратов в Emacs. )

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .