Как сдвинуть каретку в файле с

Обновлено: 06.07.2024

Возврат каретки означает возврат к началу текущей строки без продвижения вниз. Название происходит от каретки принтера, так как мониторы были редкостью, когда название было придумано. Обычно это экранируется как \r , сокращенно CR , и имеет значение ASCII 13 или 0x0D .

Перевод строки означает переход вниз на следующую строку; тем не менее, он был перепрофилирован и переименован. Используемый как "новая строка ", он заканчивает строки (обычно путают с разделительными линиями). Обычно это экранируется как \n , сокращенно LF или NL, и имеет значение ASCII 10 или 0x0A . CRLF (но не CRNL) используется для пары \r\n .

Подача формы означает переход вниз на следующую «страницу». Он обычно использовался в качестве разделителей страниц, но теперь также используется в качестве разделителей разделов. (Он редко используется в исходном коде для разделения логически независимых функций или групп функций.) Текстовые редакторы могут использовать этот символ при «вставке разрыва страницы». Обычно это экранируется как \f , сокращенно FF , и имеет значение ASCII 12 или 0x0C .

Как управляющие символы, они могут интерпретироваться по-разному.

Наиболее распространенное отличие (и, вероятно, единственное, о чем стоит беспокоиться) - строки заканчиваются CRLF в Windows, NL в Unix-like и CR в старых Mac (ситуация изменилась с OS X, чтобы быть похожей на Unix). Обратите внимание, что смещение значения от LF к NL для одного и того же символа дает различия между Windows и Unix. (Windows, конечно, новее, чем Unix, поэтому она не приняла этот семантический сдвиг. Я не знаю историю Mac, использующих CR.) Многие текстовые редакторы могут читать файлы в любом из этих трех форматов и конвертировать между ними , но не все утилиты могут.

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

Я работаю со связью для некоторого оборудования, связанного с TCP / IP, в C ++.
Оборудование требует, чтобы отправленные команды заканчивались на \ r \ n.

У меня проблема в том, что команды \ r \ n интерпретируются как 4 символа, а не как возврат каретки и перевод строки.

Я пытался использовать string.data (), но я получаю тот же результат, что и string.c_str ().

Есть ли какая-нибудь хорошая функция, чтобы получить ее правильно с самого начала, или мне нужно решить эту проблему с помощью обычной функции замены? Или какой-то другой способ, о котором я не думал?

Я думаю, если я не найду действительно аккуратный способ сделать это, я просто опущу \ r \ n в файле конфигурации и добавлю его потом, но было бы хорошо, чтобы все это было в файле конфигурации без каких-либо трудностей. кодирование. Я думаю, что мне нужно было бы также выполнить некоторое жесткое кодирование, если бы я попытался заменить четыре символа \ r \ n их правильными символами.

Спасибо за любую помощь

Редактировать:
Файл конфигурации содержит строки, подобные этой.

Решение

Если данные в файле конфигурации требуют перевода, вы
надо перевести это. Если не считать регулярных выражений (которые
явно излишним для этого), я не знаю ни одного стандарта
функция, которая сделала бы это. Мы используем что-то вроде:

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

Другие решения

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

Предполагая, что у вас есть пара имя-значение в вашем файле conf:

анализируя строку перед отправкой, вы можете сгенерировать фактическую строку.
Если вы не можете сохранить APPEND_EOL в той же строке, вы можете выбрать его из ENV со значением по умолчанию, если оно не определено, или, возможно, в другом вашем конфигурационном файле.

Прикладная программа использует функцию CreateCaret, чтобы установить параметры для каретки. Windows формирует каретку, инвертируя цвет пикселя внутри прямоугольника, определяемого позицией каретки, шириной и высотой. Ширина и высота устанавливаются в логических единицах измерения; следовательно, вид каретки подчинен режиму отображения окна.

После того, как каретка определена, прикладная программа использует функцию ShowCaret, чтобы сделать каретку видимой. Когда каретка появляется, она автоматически начинает мерцать. Чтобы показывать плотную каретку, Windows инвертирует каждый пиксель в прямоугольнике; чтобы показывать серую каретку, Windows инвертирует каждый второй пиксель; чтобы показывать растровую каретку, Windows инвертирует только белые биты точечного рисунка.

Прошедшее время, в миллисекундах, требуемых, чтобы инвертировать каретку называется частотой мерцания (blink time). Пользователь может устанавливать частоту мерцания каретки, используя Панель Управления, а прикладные программы должны соблюдать параметры настройки, которые выбрал пользователь. Прикладная программа может определять частоту мерцания каретки, используя функцию GetCaretBlinkTime. Если Вы пишите прикладную программу, которая позволяет пользователю корректировать частоту мерцания, типа апплета Панели Управления, используйте функцию SetCaretBlinkTime, чтобы установить скорость частоты мерцания путем установки числа миллисекунд. Период мерцания (flash time) - затраченное время, в миллисекундах, требуемое, чтобы показать, инвертировать и восстановить изображение каретки. Время мерцания каретки - вдвое больше, чем частота мерцания.

Прикладная программа может определять позицию каретки, используя функцию GetCaretPos. Позиция, в рабочих координатах, копируется в структуру POINT, определяемую параметром в GetCaretPos. Прикладная программа может перемещать каретку в окно, используя функцию SetCaretPos. Окно может перемещать каретку только тогда, если оно уже обладает кареткой. SetCaretPos может перемещать каретку не зависимо от того, является ли она видимой или нет.

Удаление каретки

Прикладная программа может удалять каретку с экрана и уничтожать форму, используя функцию DestroyCaret. DestroyCaret уничтожает каретку только тогда, если окно, включаемое в текущей задаче обладает кареткой(Примеч. переводчика: сразу двух кареток на экране не должно быть! Это чревато зависанием системы).

Создание и отображение каретки

После приема фокуса клавиатуры, окно должно создать и показывать каретку. Используйте функцию CreateCaret, чтобы создать каретку в данном окне. Вы можете затем вызывать SetCaretPos, чтобы установить текущую позицию каретки и ShowCaret, чтобы сделать каретку видимой.

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

Альтернативно, Вы можете использовать функцию CreateCaret или CreateDIBitmap, чтобы возвратить дескриптор точечного рисунка каретки. Для получения дополнительной информации о точечных рисунках, см. Точечные рисунки.

Если ваша прикладная программа определяет дескриптор точечного рисунка, CreateCaret игнорирует параметры высоты и ширины. Точечный рисунок определяет размер каретки.

Сокрытие каретки

Если ваша прикладная программа вызывает функцию HideCaret несколько раз без вызова ShowCaret, каретка не будет отображаться на экране до тех пор, пока прикладная программа также не вызовет функцию ShowCaret то же самое число раз.

Уничтожение каретки

Регулировка частоты мерцания

Базирующиеся на Win32 прикладные программы должны соблюдать частоту мерцания, выбранную пользователем. Функция SetCaretBlinkTime должна вызываться лишь той прикладной программой, которой пользователь позволяет установку частоты мерцания.

Обработка вводимой информации из клавиатуры

Следующий пример показывает, как использовать каретку в обычном редакторе текста. Пример модифицирует позицию каретки, поскольку пользователь вводит с клавиатуры печатные символы и использует различные клавиши, чтобы двигаться по рабочей области.

Функция CreateCaret

Функция CreateCaret создает новую форму для каретки системы и присваивает монопольное использование каретки заданному окну. Форма каретки может быть строка, блок, или точечный рисунок.

Параметры
hWnd
Идентифицирует окно, которое обладает кареткой.
hBitmap
Идентифицирует точечный рисунок, который определяет форму каретки. Если этот параметр - НОЛЬ (NULL), каретка объемная. Если этот параметр - (HBITMAP) 1, каретка серая. Если этот параметр - дескриптор точечного рисунка, каретка - определяется точечным рисунком. Дескриптор точечного рисунка, должен быть создан функцией CreateBitmap, CreateDIBitmap, или LoadBitmap. Если hBitmap - дескриптор точечного рисунка, CreateCaret игнорирует параметры nWidth и nHeight; точечный рисунок сам определяет собственную ширину и высоту.
nWidth
Устанавливает ширину каретки в логических единицах измерения. Если этот параметр нулевой, ширина устанавливается шириной границы определенного системой окна. Если hBitmap - дескриптор точечного рисунка, CreateCaret игнорирует этот параметр.
nHeight
Устанавливает высоту, в логических единицах измерения, каретки. Если этот параметр нулевой, высота устанавливается высотой границы определенной системой окна. Если hBitmap - дескриптор точечного рисунка, CreateCaret игнорирует этот параметр.

Возвращаемые значения
Если функция завершается успешно, возвращаемое значение отлично от нуля. Если функция потерпит неудачу, возвращаемое значение нулевое. Чтобы получить расширенные данные об ошибках, вызовите GetLastError.

Замечания
Параметры nWidth и nHeight устанавливают ширину и высоту каретки, в логических единицах измерения; точная ширина и высота, в пикселях, зависят от режима отображения окна.
CreateCaret автоматически уничтожает предыдущую форму каретки, если таковая имеется, независимо от окна, которое обладает кареткой. Каретка скрыта до вызова из прикладной программы функцией ShowCaret, которая делает каретку видимой.
Каретка - общедоступный ресурс; имеется только одна каретка в системе. Окно должно создать каретку только тогда, когда оно имеет фокус клавиатуры или активно. Окно должно уничтожить каретку перед потерей фокуса клавиатуры или перед потерей активности.
Вы можете возвратить ширину или высоту границы окна системы, используя функцию GetSystemMetrics, определяя значения флажков SM_CXBORDER и SM_CYBORDER. Использование ширины или высоты границы окна гарантирует, что каретка будет видима на экране с высокой разрешающей способностью.

Смотри также
CreateBitmap, CreateDIBitmap, DestroyCaret, GetSystemMetrics, HideCaret, LoadBitmap, ShowCaret

Размещение и совместимость CreateCaret

Функция DestroyCaret

Функция DestroyCaret уничтожает текущую форму каретки, освобождает каретку от окна и удаляет каретку с экрана. Если форма каретки основана на точечном рисунке, DestroyCaret не освобождает точечный рисунок.

Параметры
У этой функции нет параметров.

Возвращаемые значения
Если функция завершается успешно, возвращаемое значение отлично от нуля. Если функция потерпит неудачу, возвращаемое значение нулевое. Чтобы получить расширенные данные об ошибках, вызовите GetLastError.

Замечания
Функция DestroyCaret уничтожает каретку только тогда, если окно в текущей задаче обладает кареткой. Если окно, которое не в текущей задаче, обладает кареткой, DestroyCaret не делает ничего и возвращает значение ЛОЖЬ (FALSE). Каретка - общедоступный ресурс; в системе имеется только одна каретка. Окно должно создавать каретку только тогда, когда оно имеет фокус клавиатуры или активно. Окно должно уничтожить каретку перед потерей фокуса клавиатуры или переходом в режим не активного.

Смотри также
CreateCaret, HideCaret, ShowCaret

Размещение и совместимость DestroyCaret

Функция GetCaretBlinkTime

Функция GetCaretBlinkTime возвращает прошедшее время, в миллисекундах, требуемых, чтобы инвертировать пиксели каретки. Пользователь может устанавливать это значение, используя Панель Управления.

Параметры
У этой функции нет параметров.

Возвращаемые значения
Если функция завершается успешно, возвращаемое значение - частота мерцания, в миллисекундах. Если функция потерпит неудачу, возвращаемое значение нулевое. Чтобы получать расширенные данные об ошибках, вызовите GetLastError.

Смотри также
SetCaretBlinkTime

Размещение и совместимость GetCaretBlinkTime

Функция GetCaretPos

Функция GetCaretPos копирует позицию каретки, в рабочих координатах, в определяемой структуре POINT.

Параметры
lpPoint
Указывает на структуру POINT, которая принимает рабочие координаты каретки.

Возвращаемые значения
Если функция завершается успешно, возвращаемое значение отлично от нуля. Если функция потерпит неудачу, возвращаемое значение нулевое. Чтобы получить расширенные данные об ошибках, вызовите GetLastError.

Замечания
Позиция каретки всегда дана в рабочих координатах окна, которое содержит каретку.

Смотри также
SetCaretPos, POINT

Размещение и совместимость GetCaretPos

Функция HideCaret

Функция HideCaret удаляет каретку с экрана. Сокрытие каретки не уничтожает её текущую форму и не считает не состоявшейся вставку указателя.

Параметры
hWnd
Идентифицирует окно, которое обладает кареткой. Если этот параметр - НОЛЬ (NULL), HideCaret ищет текущую задачу для окна, которое обладает кареткой.

Возвращаемые значения
Если функция завершается успешно, возвращаемое значение отлично от нуля. Если функция потерпит неудачу, возвращаемое значение нулевое. Чтобы получить расширенные данные об ошибках, вызовите GetLastError.

Замечания
Функция HideCaret скрывает каретку только в том случае, если заданное окно обладает кареткой. Если заданное окно не обладает кареткой, HideCaret не делает ничего и возвращает значение ЛОЖЬ (FALSE). Сокрытие накапливается. Если ваша прикладная программа вызвала HideCaret пять раз подряд, она должна также вызвать ShowCaret пять раз прежде, чем каретка отобразится на экране.

Размещение и совместимость HideCaret

Функция SetCaretBlinkTime

Функция SetCaretBlinkTime устанавливает частоту мерцания каретки по установленному числу миллисекунд. Частота мерцания - прошедшее время, в миллисекундах, требуемых, чтобы инвертировать пиксели каретки.

Параметры
uMSeconds
Устанавливает новую частоту мерцания, в миллисекундах.

Возвращаемые значения
Если функция завершается успешно, возвращаемое значение отлично от нуля. Если функция потерпит неудачу, возвращаемое значение нулевое. Чтобы получить расширенные данные об ошибках, вызовите GetLastError.

Замечания
Пользователь может устанавливать частоту мерцания, используя Панель Управления. Прикладные программы должны соблюдать установки, которые выбрал пользователь. Функция SetCaretBlinkTime должна использоваться только той прикладной программой, которая позволяет пользователю устанавливать частоту мерцания, типа приложения Панели Управления.
Если Вы изменяете частоту мерцания, то впоследствии активизированные прикладные программы используют измененную частоту мерцания, даже если Вы восстанавливаете предыдущую частоту мерцания, когда теряете фокус клавиатуры или становитесь неактивными. Это особенность многопоточной среды, где деактивизация вашей прикладной программы не синхронизирована с активизацией другой прикладной программы. Это свойство позволяет системе активизировать другую прикладную программу, даже если текущая прикладная программа зависла.

Размещение и совместимость SetCaretBlinkTime

Функция SetCaretPos

Функция SetCaretPos перемещает каретку в заданные координаты. Если окно, которое обладает кареткой, было создано со стилем класса CS_OWNDC, то определяемые координаты подчинены режиму отображения контекста устройства, связанного с этим окном.

Параметры
X
Устанавливает новую x-координату каретки.
Y
Устанавливает новую y-координату каретки.

Возвращаемые значения
Если функция завершается успешно, возвращаемое значение отлично от нуля. Если функция потерпит неудачу, возвращаемое значение нулевое. Чтобы получить расширенные данные об ошибках, вызовите GetLastError.

Замечания
Функция SetCaretPos перемещает каретку, независимо от того скрыта каретка или нет. Каретка - общедоступный ресурс; имеется только одна каретка в системе. Окно может устанавливать позицию каретки только тогда, если оно обладает кареткой.

Размещение и совместимость SetCaretPos

Функция ShowCaret

Функция ShowCaret делает каретку видимой на экране в текущей позиции каретки. Когда каретка становится видимой, она начинает автоматически мерцать.

Параметры
hWnd
Идентифицирует окно, которое обладает кареткой. Если этот параметр - НОЛЬ (NULL), ShowCaret ищет текущую задачу окна, которая обладает кареткой.

Возвращаемые значения
Если функция завершается успешно, возвращаемое значение отлично от нуля. Если функция потерпит неудачу, возвращаемое значение нулевое. Чтобы получить расширенные данные об ошибках, вызовите GetLastError.

Замечания
ShowCaret показывает каретку только в том случае, если определяемое окно обладает кареткой, каретка имеет форму и не была скрыта два или больше раз подряд. Если одно или большее количество из этих условий не выполнено, ShowCaret не делает ничего и возвращает значение ЛОЖЬ (FALSE).
Сокрытие накапливается. Если ваша прикладная программа обратились к функции HideCaret пять раз подряд, она должна также обратиться к ShowCaret пять раз прежде, чем каретка появится вновь.
Каретка - общедоступный ресурс; имеется только одна каретка в системе. Окно должно показать каретку только тогда, когда окно имеет фокус клавиатуры или активно.

Рис. 4.2 иллюстрирует различия между escape-последовательностями «возврат каретки» и «новая строка». Когда вы работаете с клавиатурой, нажатие клавиши Enter производит действие, аналогичное тому, что в языке Си называется новой строкой. Некоторые программисты называют это комбинацией возврата каретки и перевода строки, сокращенно CR/LF (от английского carriage return/line feed). Использование кода «возврат каретки» в языке Си не приводит к переходу на новую строку.


Рис. 4.2. Различия между кодами «возврат каретки» и «новая строка»

Действие кода \r можно видеть на примере следующей инструкции:

В результате ее выполнения на экране появится только слово «Правый». И вот почему: после отображения на экране слова «Левый», код \r переводит курсор в начало этой строки, и при отображении слова «Правый» составляющие его символы замещают собой символы слова «Левый». Код \r сам по себе не уничтожает выведенные на экран символы, когда возвращает курсор, и только вывод новых символов после возврата курсора стирает уже существующий текст.

Код «возврат на шаг»

В отличие от кода \r, который возвращает курсор в начало строки, код «возврат на шаг» \b передвигает курсор только на одну позицию влево. При перемещении курсора существующие символы не уничтожаются, как и при возврате каретки.

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

Код «перевод страницы»

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

Отображение специальных символов на экране монитора

Вы можете использовать escape-последовательности для вывода на дисплей специальных символов. Программисты часто используют их для вывода символов, изображение которых невозможно получить иным способом:

Читайте также: