我有两段代码。
#define BUFFSIZE 30
#define STDIN_FILENO 0
#define STDOUT_FILENO 1
#define STDERR_FILENO 2
#include <strings.h>
int main(void)
{
int n;
char buf[BUFFSIZE];
while ( (n = read(STDIN_FILENO, buf, BUFFSIZE)) > 0)
if (write(STDOUT_FILENO, buf, n) != n)
err_sys("write error");
if (n < 0)
err_sys("read error");
exit(0);
}
还有一个
#define STDIN_FILENO 0
#define STDOUT_FILENO 1
#define STDERR_FILENO 2
#include <stdio.h>
#include <strings.h>
int main(void) {
int c;
while ( (c = getc(stdin)) != EOF)
if (putc(c, stdout) == EOF)
err_sys("output error");
if (ferror(stdin))
err_sys("input error");
exit(0); }
对于第一个程序,我想如果我输入一个长度大于BUFFZISE的字符串,索引大于BUFFZISE的字符将被淘汰。但事实并非如此。为什么会这样?这两种 I/O 机制的主要区别是什么?非常感谢。
最佳答案
对我来说,I/O 级别之间的基本区别是较低级别没有缓冲(在标准库中)。
在您的情况下,第一个示例是使用您自己的大小为 BUFFSIZE 的缓冲区进行读写。在第二个示例中,您正在读取/写入单个字符,这取决于缓冲是由库完成的事实。否则,两个示例都在做同样的事情。
与非阻塞 I/O 等高层函数相比,底层函数允许使用更多的选项。使用高级函数的程序也可能会慢一点。在您的第二个示例中,数据从输入缓冲区(逐字节)复制到输出缓冲区,这在第一个示例中没有发生。
顺便说一句,你的第一个例子可能会遗漏一些字符,循环应该是这样的:
while ( (n = read(STDIN_FILENO, buf, BUFFSIZE)) > 0) {
int i, k = 0;
do {
i = write(STDOUT_FILENO, buf+k, n-k);
if (i < 0) {err_sys("write error"); break;}
k += i;
} while (k < n);
}
关于c - 标准 I/O 和低级 I/O 的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22267348/