gpt4 book ai didi

c - 标准 I/O 和低级 I/O 的区别

转载 作者:太空宇宙 更新时间:2023-11-04 03:48:50 25 4
gpt4 key购买 nike

我有两段代码。

#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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com