我有两个代码段:
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,缓冲区在发送所有数据之前会有多少数据?
由于
答案 0 :(得分:2)
虽然这两个函数都可以用来从文件中读取,但它们却截然不同。首先,在许多系统上read
是一个较低级别的功能,甚至可能是直接进入操作系统的系统调用。 read
函数也不是标准的C或C ++,它是例如POSIX。它还可以读取任意大小的块,而不是一次只读取一个字节。没有缓冲(除了可能在OS /内核级别),并且它在“二进制”和“文本”数据之间没有区别。在POSIX系统上,read
是一个系统调用,它可以用来读取所有类型的设备,而不仅仅是文件。
getc
函数是更高级别的函数。它通常使用缓冲输入(因此输入以块的形式读入缓冲区,有时使用read
,getc
函数从该缓冲区获取其字符)。它一次只返回一个字符。作为标准库的一部分,它也是C和C ++规范的一部分。此外,可能会有读取数据和函数返回的数据的转换,具体取决于文件是以文本还是二进制模式打开。
另一个区别是read
也始终是一个函数,而getc
可能是预处理器宏。
比较read
和getc
并没有多大意义,更有意义的是将read
与fread
进行比较。