POSIX`read()`的`buf`应该被签名还是未签名?有关系吗

时间:2018-06-25 14:12:27

标签: c posix unsigned signed

POSIX读取函数定义为ssize_t read(int fd, void *buf, size_t count);,并将其buf参数设为void*

传入的实际缓冲区是char s还是unsigned char s数组是否重要?如果是这样,我应该使用哪一个?我用谷歌搜索并阅读了那个人,但是甚至没有提到缓冲区的 type ,更不用说它的签名了。

4 个答案:

答案 0 :(得分:5)

具有声明的类型void *的原因是,您几乎可以读取任何类型。您可以阅读char。您可以阅读unsigned char。如果您先前写入文件的内容也是int,则可以读取int。如果已写入文件,则可以读取struct div_t

选择写入文件的任何类型,或者读取任意字节,无论哪种类型最适合以后的处理。

答案 1 :(得分:2)

  

传入的实际缓冲区是char还是unsigned char s的数组有关系吗?

不。而且,这些不是您唯一的选择。第二个自变量指向的缓冲区可以具有 any 对象类型。指向char数组或unsigned char数组是很常见的,但指向某种(其他)整数类型的数组或结构对象并不罕见类型或其他内容。

主要目的是根据发送方期望的数据类型来解释接收到的数据,这要求您要么事先知道,要么能够从数据中确定期望的类型。换句话说,发送者和接收者需要在某种通信协议上达成共识。

最简单的协议是未区分的字节流;为此,unsigned char数组是最合适的选择。其他一些选择更适合其他协议。

答案 2 :(得分:0)

“ read()尝试从文件描述符fd读取计数到buf开头的缓冲区中的字节。”

Read()将存储文件描述符(文件,套接字或其他任何内容)中的字节

无论字节的类型如何,字节都会存储在您的指针地址中。程序理解这些字节的方式取决于声明的方式。

例如,在buf声明时,程序可能会将相同的字节0xFF解释为255或-1

答案 3 :(得分:0)

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

  

read()函数应尝试从与打开文件描述符fildes关联的文件中读取nbyte字节到buf所指向的缓冲区中。

由您决定如何解释字节。您的bufchar还是unsigned char的数组不会影响read的工作方式。只有您决定如何解释数据。如果文件中包含的数据不是char,那么如果将它们视为char的数组,则可能最终会误解其内容。再次取决于您的平台。

将数据解释为unsigned char的数组也不一定正确。文件中的数据可能是包含混合数据类型的floats数组或struct数组。

底线-您需要将数据读入内存中的相应对象类型。为此,您必须知道文件中保存了什么。