Используйте специальные символы, кроме "\ n" и "\ 0" в C - PullRequest
0 голосов
/ 11 июля 2019

У меня есть один вопрос.Я пишу код на C, в UNIX.Мне нужно написать специальный символ в файле, потому что мне нужно разделить файл на маленькие секции.

Пример:

'SPECIAL_CHARACTER'
section 1 with some text
'SPECIAL_CHARACTER'
section 2 with some text

и т. Д.

Я былдумает использовать символ '\ 1'. Кажется, это работает, но это нормально?Или это неправильно?

Чтобы сделать эти вещи без использования таких символов, как "\ 0" или "\ n", что мне делать?

1 Ответ

2 голосов
/ 11 июля 2019

Я слышу два разных вопроса, где вы спрашиваете «Или это неправильно?»

Я слышу, как вы спрашиваете "как я могу обозначить байт разделителя в моем коде?", И я слышу, как вы спрашиваете "каков хороший выбор для байта разделителя?"

Сначала , в сущности, то, о чем вы спрашиваете, описано в разделе 6.4.4.4 спецификации языка C, который охватывает «Символьные константы C». Существуют различные места, где вы можете найти формальную спецификацию языка C или поискать «символьные константы C», чтобы найти более дружелюбное описание и т. Д.

Подробно, несколько букв могут использоваться в escape-последовательностях для замены отдельных байтов определенных значений; например, \n - это один из них, в качестве замены для 0x0a (десятичное число 10), байт, обозначенный (в ASCII) символом новой строки. Вот юридические:

\a \b \f \n \r \t \v

escape-последовательности \0 и \1 работают, потому что C поддерживает использование \ с последующими цифрами в качестве восьмеричного значения. Таким образом, это также будет работать, скажем, с \3 и \35, но не с \9, и обратите внимание, что \35 имеет десятичное значение 29. (Google "восьмеричные значения", если вы не сразу понять, почему это так.)

Существуют и другие допустимые escape-последовательности:

\' \" \\ \?    :   '  "  \  and  ?, respectively
\xNNNN...      :   each 'N' can be a hexadecimal digit

И, конечно же, escape-последовательности являются лишь одним аспектом символьных констант C.

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

Я лично согласен с тем, что 0x1e имеет, пожалуй, самый большой смысл, поскольку в ASCII это "разделитель записей". Соответствие ASCII может иметь значение, если данные должны будут быть поняты другими программами, или если ваша программа должна быть понята другими людьми.

С другой стороны, простой комментарий к коду может дать понять любому, кто читает ваш код, какое значение байта вы используете для разделения разделов вашего файла данных, и любая программа, которая должна понимать ваши файлы данных, должна «знать» гораздо больше о формате файла, чем просто разделитель записей. В 0x1e нет ничего волшебного: это просто соглашение и зарезервированное место в таблице ASCII, чтобы облегчить общую необходимость - то есть разделение записей текста, которое может содержать обычные разделители текста, такие как пробел, символ новой строки и ноль. .

В общем, любое значение байта, которое не будет отображаться в содержимом ваших разделов, могло бы стать хорошим разделителем разделов. Поскольку вы говорите, что это содержимое будет текстовым, существует более 100 вариантов, даже если вы исключите \0 (0x00) и \n (0x0a). В ASCII для этих целей было выделено несколько байтовых значений, что помогает сократить выбор с нескольких десятков до нескольких. Даже среди этих нескольких, только несколько обычно используются в качестве разделителей.

...