不带缓冲的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也在改头文件中定义,他们分别表示标准输入和标准输出;

时间: 2024-10-14 20:37:02

不带缓冲的IO的标准输入到标准输出的相关文章

带缓冲的IO和不带缓冲的IO

文件描述符: 文件描述符是一个小的非负整数,是内核用来标识特定进程正在访问的文件 标准输入/输出/出错: shell为每个程序打开了三个文件描述符,STDIN_FILEON,STDOUT_FILEON,STDERR_FILEON,默认这三个文件描述符都链向终端 不带缓冲的IO: 函数open read write lseek close提供了不用缓冲的IO.这些函数都使用文件描述符 size_t read(int fd,void *buf,size_t count) 从fd标识的文件中一次读取c

Go标准库-带缓冲的IO(bufio)

概述bufio模块通过对io模块的封装,提供了数据缓冲功能,能够一定程度减少大块数据读写带来的开销. 实际上在bufio各个组件内部都维护了一个缓冲区,数据读写操作都直接通过缓存区进行.当发起一次读写操作时,会首先尝试从缓冲区获取数据:只有当缓冲区没有数据时,才会从数据源获取数据更新缓冲. Reader可以通过NewReader函数创建bufio.Reader对象,函数接收一个io.Reader作为参数:也就是说,bufio.Reader不能直接使用,需要绑定到某个io.Reader上.函数声明

Go中常用包笔记 bufio:带缓冲的IO操作/SCANNER(二)

Package bufio 提供可缓存的IO访问   Scanner:    func NewScanner(r io.Reader) *Scanner //构造函数    func (s *Scanner) Buffer(buf []byte, max int) //指定使用的缓冲区    func (s *Scanner) Split(split SplitFunc) //设定切割函数 使用四个切割器    func (s *Scanner) Scan() bool  //扫描    fun

带缓冲IO和不带缓冲IO

不带缓冲IO是指read(),write()等函数 标准(带缓冲)IO是指fread(),fwrite()等函数 实际上缓冲有两种,是用户空间上的缓冲(流缓冲区)和内核缓冲区.无论是不带缓冲IO还是标准IO都要通过系统调用将数据输入到内核缓冲区. 所谓的带缓冲是指带流缓冲区. 可以参考文章http://blog.sina.cn/dpool/blog/s/blog_6592a07a0101gar7.html

UNIX环境编程学习笔记(2)——不带缓冲的 I/O

lienhua342014-08-25 1 文件描述符 对于内核而言,所有打开的文件都通过文件描述符引用.文件描述符是一个非负整数.当打开一个现有文件或创建一个新文件时,内核向进程返回一个文件描述符.当读或写一个文件时,使用 open 或 creat 返回的文件描述符标识该文件,将其作为参数传送给 read 或 write. 按照惯例,UNIX 系统 shell 使用文件描述符 0 与进程的标准输入相关联,文件描述符 1 与进程的标准输出相关联,文件描述符 2 与进程的标准出错输出相关联. 2

使用带缓冲的字节流读写数据

首先不使用带缓冲的字节流: package com.yunqing; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; public class bytelianxi { public static void main(String[] args) { try { //输入流"video.mp4": 相对路径:idea读取根目录下的video.mp4文

带缓冲I/O 和不带缓冲I/O的区别与联系

首先要明白不带缓冲的概念:所谓不带缓冲,并不是指内核不提供缓冲,而是只单纯的系统调用,不是函数库的调用.系统内核对磁盘的读写都会提供一个块缓冲(在有些地方也被称为内核高速缓存),当用write函数对其写数据时,直接调用系统调用,将数据写入到块缓冲进行排队,当块缓冲达到一定的量时,才会把数据写入磁盘.因此所谓的不带缓冲的I/O是指进程不提供缓冲功能(但内核还是提供缓冲的).每调用一次write或read函数,直接系统调用. 而带缓冲的I/O是指进程对输入输出流进行了改进,提供了一个流缓冲,当用fw

js+css实现带缓冲效果右键弹出菜单

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Typ

jQuery生成横向带缓冲的水平运动

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-