C++ 什么';这是read()和getc()之间的区别

C++ 什么';这是read()和getc()之间的区别,c++,c,C++,C,我有两个代码段: while((n=read(0,buf,BUFFSIZE))>0) if(write(1,buf,n)!=n) err_sys("write error"); while((c=getc(stdin))!=EOF) if(putc(c,stdout)==EOF) err_sys("write error"); 网络上的一些格言让我感到困惑。我知道标准I/O会自动进行缓冲,但我已经向read()传递了一个buf,所以re

我有两个代码段:

while((n=read(0,buf,BUFFSIZE))>0)
    if(write(1,buf,n)!=n)
        err_sys("write error");


while((c=getc(stdin))!=EOF)
    if(putc(c,stdout)==EOF)
        err_sys("write error");
网络上的一些格言让我感到困惑。我知道标准I/O会自动进行缓冲,但我已经向
read()
传递了一个buf,所以
read()
也在进行缓冲,对吗?似乎
getc()
逐字符读取数据,在发送所有数据之前,缓冲区将有多少数据


谢谢

虽然这两个函数都可以用来读取文件,但它们非常不同。首先,在许多系统上,
read
是一个较低级别的函数,甚至可能是直接进入操作系统的系统调用。<代码> Read 函数也不是标准C或C++,是函数的一部分。它还可以读取任意大小的块,而不是一次只能读取一个字节。没有缓冲(除了操作系统/内核级别),而且“二进制”和“文本”数据之间没有区别。在POSIX系统上,
read
是一个系统调用,它可以用于读取所有类型的设备,而不仅仅是文件

getc
函数是一个更高级别的函数。它通常使用缓冲输入(因此输入以块的形式读入缓冲区,有时使用
read
,而
getc
函数从该缓冲区获取其字符)。它一次也只返回一个字符。它也是C和C++规范的一部分,作为标准库的一部分。此外,函数读取的数据和返回的数据可能会发生转换,这取决于文件是以文本模式还是二进制模式打开的

另一个区别是
read
也始终是一个函数,而
getc
可能是一个预处理器宏


比较
read
getc
没有多大意义,更重要的是将
read
与进行比较。

read
是一个操作系统函数,
getc
是一个标准的C宏。这取决于编译器(从技术上讲,是编译器使用的C标准库实现)是否通过底层调用
read
实现
getc
等,还是执行其他操作。
getc
是标准C函数,而不是宏。(C)在某些条件下,所有函数都可以实现为宏。在C++中,这是不允许的;如“代码>结构X xint int GCH());},需要按预期编译,并且<代码> x::GETC< /C> >与<代码>:GETC< <代码>不同。(或<代码> STD::GETC< /Cord>),如果你已经包含了“代码只读取字符,而不是二进制数据”部分。@ cNICUTAR删除了部分“<代码> GETC< /Cord>可能是预处理器宏”:仅在C中,而不是在C++中,并且即使作为宏,函数也必须存在,因此<代码> int(*PF)(文件*)=&getc;将起作用。@cnicutar这取决于文件的打开方式。在文本模式下,
getc
只能保证能够读取文本。(因为他比较的是
read
,但是,我们可以假设Unix,在这种情况下,文本模式与二进制模式相同,您可以读取任何内容。)@JamesKanze我刚刚检查了C++11规范,它没有在任何地方提到它,只是它是
的一部分。虽然我没有阅读所有的C规范,但它是我所知道的唯一一个(在某种程度上)说它可以作为宏实现的规范。可能是因为许多历史实现都将它作为宏实现。