Должен ли POSIX `read ()` `` buf` быть `подписанным` или` неподписанным`? Имеет ли это значение? - PullRequest
0 голосов
/ 25 июня 2018

Функция чтения POSIX определяется как ssize_t read(int fd, void *buf, size_t count);, принимая аргумент buf как void*.

Имеет ли значение, является ли фактический переданный буфер массивом char с или unsigned char s?Если да, то какой мне следует использовать?Я гуглил и прочитал человека, но даже тип буфера не упоминается, не говоря уже о его подписи.

Ответы [ 4 ]

0 голосов
/ 25 июня 2018

С http://pubs.opengroup.org/onlinepubs/009695399/functions/read.html:

Функция read() должна пытаться считывать n-байтовые байты из файла, связанного с дескриптором открытого файла, fildes, в буфер, на который указывает buf.

Вам решать, как интерпретировать байты.Является ли ваш buf массивом char или unsigned char, не имеет значения для работы read.Только вы решаете, как интерпретировать данные.Если данные, содержащиеся в файле, не char, вы можете неправильно интерпретировать его содержимое, если будете рассматривать их как массив char.Это опять же зависит от вашей платформы.

Не обязательно также правильно интерпретировать данные как массив unsigned char.Данные в файле могут быть массивом floats или массивом struct, содержащим смешанные типы данных.

Нижняя строка - вам нужно прочитать данные в соответствующий тип объекта в памяти.Для этого вам необходимо знать, что сохраняется в файле.

0 голосов
/ 25 июня 2018

Имеет ли значение, если фактический переданный буфер является массивом char с или unsigned char с?

Нет. Более того, это не единственный ваш выбор. Буфер, на который указывает второй аргумент, может иметь любой тип объекта. Обычно он указывает либо на массив char, либо на массив unsigned char, но не так уж редко он указывает на массив некоторого (другого) целочисленного типа, или на объект структурного типа, или на что-то еще.

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

Самым простым из возможных протоколов является недифференцированный поток байтов; для этого наиболее подходящим является массив unsigned char. Некоторые другие варианты лучше подходят для других протоколов.

0 голосов
/ 25 июня 2018

"read () пытается прочитать количество байтов из файлового дескриптора fd в буфер, начиная с buf."

Read () сохранит байтов из вашего файлового дескриптора (будь то файл, сокет или что-то еще).

Байты будут храниться по адресу вашего указателя, независимо от его типа. То, как ваша программа понимает эти байты, зависит от того, как вы объявили это.

так, например, тот же байт 0xFF может быть интерпретирован вашей программой как 255 или -1 при объявлении buf

0 голосов
/ 25 июня 2018

Причина наличия объявленного типа void * заключается в том, что вы можете читать практически любой тип.Вы можете прочитать char.Вы можете прочитать unsigned char.Вы можете прочитать int, если то, что вы ранее записали в файл, также было int.Вы можете прочитать struct div_t, если это то, что было записано в файл.

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

...