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

标签 c io

我有两段代码。

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

相关文章:

java - 如何解析字符串以分隔整数? java

haskell - 在编译时或运行时生成一个随机字符串,并在程序的其余部分使用它

c - 即使我使用它, make 也会告诉我使用 std c99

c - 结构体数组中矩阵的动态内存分配

c - 我的 C 代码有什么问题(C 初学者)

c# - 使用 Windows 资源管理器的重命名事件 Hook 我的程序

haskell - 在 Haskell 中等待然后检测按键的简单方法是什么?

c - 如何使用 C API 调用线程安全的 rrd_update_r Round Robin 数据库函数?

c - Eustis 上检测到堆栈粉碎

c - 从文件中读取链表并加载数据