read()和getc()之间有什么区别

时间:2014-03-06 10:07:49

标签: 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会自动缓冲,但我已经通过buf到read(),所以read()也在做缓冲,对吧?似乎getc()通过char读取数据char,缓冲区在发送所有数据之前会有多少数据?

由于

1 个答案:

答案 0 :(得分:2)

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

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

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

比较readgetc并没有多大意义,更有意义的是将readfread进行比较。