POSIX读取函数定义为ssize_t read(int fd, void *buf, size_t count);
,并将其buf
参数设为void*
。
传入的实际缓冲区是char
s还是unsigned char
s数组是否重要?如果是这样,我应该使用哪一个?我用谷歌搜索并阅读了那个人,但是甚至没有提到缓冲区的 type ,更不用说它的签名了。
答案 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
所指向的缓冲区中。
由您决定如何解释字节。您的buf
是char
还是unsigned char
的数组不会影响read
的工作方式。只有您决定如何解释数据。如果文件中包含的数据不是char
,那么如果将它们视为char
的数组,则可能最终会误解其内容。再次取决于您的平台。
将数据解释为unsigned char
的数组也不一定正确。文件中的数据可能是包含混合数据类型的floats
数组或struct
数组。
底线-您需要将数据读入内存中的相应对象类型。为此,您必须知道文件中保存了什么。