Значение символа в потоках C - PullRequest
0 голосов
/ 02 февраля 2019

У меня, кажется, есть слепое пятно в моем понимании значения символа в абстракции потока C;Я просто не могу сшить картинку вместе.
Что означает символ по отношению к двоичным потокам?

Из 7.19.7.1p2 ...

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

...

Предположим, я написал файл на машине, где символам требуется 16 бит, и я начал читать на машине, на которой символы помещаются в 7 бит,Тогда что я на самом деле читаю при каждом обращении к fgetc?Является ли это частью 16-битного символа (то есть я читаю 7 бит за раз) или 16-битный символ «сжат» в 7-битное представление с потерей информации?

Ответы [ 3 ]

0 голосов
/ 03 февраля 2019

char* - это способ объявления указателя на переменную char.Это полезно, когда вам нужна строка с неизвестной длиной.

1-й пример:

char name[10];
strcpy (name, "type_your_name_here"); //overwrites the first argument with the second.

Здесь вы резервируете 10 частей памяти.Вы можете использовать их все или ваше имя может быть просто «Джек», которое, если мы учитываем специальный символ '\0', который идет в конце каждой строки, занимает всего 5 фрагментов памяти.Это означает, что у вас есть 5 оставшихся фигур, которые вы не используете.

Может быть, ваше имя длиннее 10 символов, где вы будете хранить дополнительные?Вы не сможете.Потому что вы дали статическое объявление вашему массиву символов.

2-й пример:

char *name;

Это означает, что вы только что объявили переменную-указатель, в которой вы будете хранить адрес первого символав твоей строке.Это дает больше свободы и гибкости в использовании.Является ли ваше имя длинным или коротким, предопределенные строковые функции, такие как strcpy и strcat могут обрабатывать выделение памяти для вас.

Короче:

Насколько я понимаю, в первомНапример, вы определили как начальную, так и конечную точки вашей строки, что ограничивает то, что вы в нее помещаете, а также может тратить пространство памяти.Во втором примере вы указали только начальную точку, которая дает большую свободу использования и экономию памяти.Я не знаю никаких недостатков во втором примере, это всего лишь мой первый год обучения этому.Поэтому, возможно, эксперты смогут пролить свет на этот вопрос ярче, чем я.

0 голосов
/ 03 февраля 2019

Технически, char - это однобайтовый тип, который может содержать значения от -128 до 127;в зависимости от архитектуры это также может быть unsigned, содержащий значения от 0 до 255. Но, хотя это, строго говоря, целочисленный тип, он обычно не используется для хранения целых чисел.Вы почти всегда будете использовать тип int или один из его многочисленных вариантов для этого.

Тип char на практике имеет несколько специальных назначений:

Может содержать ASCIIзначение.Поскольку в некоторых расширенных версиях имеется 128 кодов ASCII или 255 кодов ASCII, char является идеальным типом для этой цели.Но когда он используется таким образом, он почти всегда появляется в программе как часть строки, которая (в C, хотя не всегда в C ++) представляет собой простой массив char.

Если выПри проектировании структуры, которая будет компактной, и вы захотите создать поле (то есть элемент данных), который никогда не будет содержать более 256 различных значений, вы можете также использовать для этой цели тип char.

Обратите внимание, что здесь есть тонкий момент, который не всегда очевиден для новых программистов на Си.Вы можете назначить коды ASCII переменным char, но это не совсем свойство char в C. Например, я могу назначить номера кодов ASCII для любого целочисленного поля.Сам язык Си не мешает этому.Но помните, что функции библиотеки C-строк предназначены для использования с массивами char, а не с массивами int.

0 голосов
/ 02 февраля 2019

Из спецификации:

3.7.1
1 символ
однобайтовый символ
〈C〉 битпредставление, которое помещается в байт

и:

3,6
1 байт
адресуемая единица измеренияхранилище данных, достаточно большое, чтобы вместить любой элемент базового набора символов среды выполнения
ПРИМЕЧАНИЕ 1 Можно однозначно выразить адрес каждого отдельного байта объекта.
ПРИМЕЧАНИЕ 2 Байт состоит из смежныхпоследовательность битов, число которых определяется реализацией.Младший значащий бит называется младшим битом;старший бит называется старшим битом.

Итак, на вашем пишущем аппарате char, скорее всего, 16-битный тип.На вашем читающем компьютере char, скорее всего, 8-битный тип.C требует, чтобы char был как минимум 8-битным типом:

5.2.4.2.1 Размеры целочисленных типов
...
- числобитов для наименьшего объекта, который не является битовым полем (байт)
CHAR_BIT 8

Итак, на вашем считывающем устройстве вам нужно сделать два fgetc призывает прочитать каждую половину 16-битных символов, которые вы написали на исходном компьютере.

...