首页 > 代码库 > 不带缓冲的IO的标准输入到标准输出

不带缓冲的IO的标准输入到标准输出

在POSIX标准中提供了函数open, read, write, lseek以及close提供不带缓冲的IO,这些函数都是使用文件描述符;


在Linux/Unix系统中将标准输入复制到标准输出简单实现如下:

#include <unistd.h>

#define BUFFSIZE 4096

int 
main(int argc, char **argv)
{
    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);
}

解析:

头文件#include <unistd.h>和两个常量STDIN_FILENO, STDOUT_FILENO是POSIX标准的一部分,头文件#include <unistd.h>中包含了很多Unix系统服务的函数原型(如本例中的read和write);

两个常量STDIN_FILENO和STDOUT_FILENO定义在该头文件中,他们指定了标准输入和标准输出的文件描述符,在POSIX标准中他们的值分别是0和1.

read函数返回读取的字节数,此值用作要写的字节数。当到达输入文件的尾端时,read返回0,程序停止执行。如果发生了错误,read返回-1;


相比之下,标准I/O实现相同的功能,代码:

#include <unistd.h>

int 
main(int argc, char **argv)
{
    char c;
    
    while((c = getc(stdin)) != EOF) {
        if(putc(c, stdout) == EOF)
            err_sys("output error");
    }
    if(ferror(stdin))
        err_sys("input error");
    
    exit(0);
}

解析:

函数getc一次读取一个字符,然后函数putc将此字符写到标准输出。读到输入的最后一个字节时,getc返回常量EOF(该常量在头文件#include <stdio.h>中定义)。标准I/O也在改头文件中定义,他们分别表示标准输入和标准输出;

不带缓冲的IO的标准输入到标准输出