Unix环境之标准IO库

UNIX的文件IO都是针对文件描述符的,而标准IO的操作则是围绕流进行的。当一个流最初被创建时,它并没有定向。若在未定向的流上使用一个多字节IO函数,则将该流的定向设置为宽定向;若在未定向的流上使用一个单字节IO函数,则将该流的定向设置为字节定向。

stdio.h定义了三个标准流,stdin、stdout和stderr,分别是标准输入、标准输出和标准出错。

缓冲——

标准IO库提供缓冲的目的是尽可能减少使用read和write调用的次数。它也对每个IO流自动地进行缓冲管理,从而避免了应用程序需要考虑这一点所带来的麻烦。标准IO提供了三种类型的缓冲:

1、全缓冲。这种情况下,在填满标准IO缓冲区后才进行实际IO操作。

2、行缓冲。在这种情况下,当在输入和输出中遇到换行符时,标准IO库执行IO操作。

3、不带缓冲。标准IO库不对字符进行缓冲存储。标准出错流stderr通常是不带缓冲的,这就使得出错信息可以尽快显示出来,而不管它们是否含有一个换行符。

调用下列函数可更改缓冲类型:

#include <stdio.h>
void setbuf(FILE *stream, char *buf);
int setvbuf(FILE *stream, char *buf, int mode, size_t size);

调用fflush函数可强制冲洗一个流:

#include <stdio.h>
int fflush(FILE *stream);

当一个进程正常终止时,直接调用exit函数,或从main函数返回,则所有带未写缓冲数据的标准IO流都会被冲洗,所有打开的标准IO流都会被关闭。

流操作——

下面三个函数可以打开一个标准IO流:

#include <stdio.h>
FILE* fopen(const char *path, const char *mode);
FILE* fdopen(int fd, const char *mode);
FILE* freopen(const char *path, const char *mode, FILE *stream);

流可分为非格式化IO和格式化IO,前者又分为字符IO、行IO和二进制IO,后者如常见的prntf和scanf等。

fclose函数关闭一个打开的流:

#include <stdio.h>
int fclose(FILE *fp);

fwide函数可以设置流的定向:

#include <wchar.h>
int fwide(FILE *stream, int mode);

与出错或到达文件尾端相关的函数:

#include <stdio.h>
int ferror(FILE *stream);
int feof(FILE *stream);
void clearerr(FILE *stream);

流定位——

#include <stdio.h>
int ftell(FILE *stream);
int fseek(FILE *stream, long offset, int whence);
void rewind(FILE *stream);
int fgetpos(FILE *stream, fpos_t *pos);
int fsetpos(FILE *stream, fpos_t *pos);
off_t ftello(FILE *stream);
int fseeko(FILE *stream, off_t offset, int whence);

字符IO——

#include <stdio.h>
int getc(FILE *stream);
int fgetc(FILE *stream);
int getchar(void);
int ungetc(int c, FILE *stream);

int putc(int c, FILE *stream);
int fputc(int c, FILE *stream);
int putchar(int c);

行IO——

#include <stdio.h>
char* gets(char *s);
char* fgets(char *s, int size, FILE *stream);
int puts(const char *s);
int fputs(const char *s, FILE *stream);

二进制IO——

#include <stdio.h>
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);

常见的格式IO——

#include <stdio.h>
int printf(const char *format, …);
int fprintf(FILE *stream, const char *format, ...);
int sprintf(char *str, const char *format, ...);
int snprintf(char *str, size_t size, const char *format, ...);

#include <stdarg.h>
int vprintf(const char *format, va_list ap);
int vfprintf(FILE *stream, const char *format, va_list ap);
int vsprintf(char *str, const char *format, va_list ap);
int vsnprintf(char *str, size_t size, const char *format, va_list ap);

#include <stdio.h>
int scanf(const char *format, ...);
int fscanf(FILE *stream, const char *format, ...);
int sscanf(const char *str, const char *format, ...);

#include <stdarg.h>
int vscanf(const char *format, va_list ap);
int vsscanf(const char *str, const char *format, va_list ap);
int vfscanf(FILE *stream, const char *format, va_list ap);

标准IO不足——

标准IO库的一个不足之处是效率不高,这与它需要复制的数据量有关。当使用每次一行函数fgets和fputs时,通常需要复制两次数据:一次是在内核和标准IO缓冲之间(当调用read和write时),第二次是在标准IO缓冲区和用户程序中的行缓冲区之间。而快速IO库则避免了这一点,其方法是使读一行的函数返回指向该行的指针,而不是将该行复制到另一个缓冲区。

时间: 2024-12-26 13:03:27

Unix环境之标准IO库的相关文章

《UNIX环境高级编程》--5 标准IO库

标准IO库 流和 FILE对象 标准IO库与文件IO区别: 标准IO库处理很多细节,如缓冲区分片.以优化的块长度执行IO等. 文件IO函数都是围绕文件描述符进行.首先打开一个文件,返回一个文件描述符:后续的文件IO操作都使用该文件描述符 标准IO库是围绕流进行的.当用标准IO库打开或者创建一个文件时,就有一个内建的流与之相关联 标准IO库的函数很多都是以 f开头,如fopen.fclose 对于ASCII字符集,一个字符用一个字节表示:对于国际字符集,一个字符可以用多个字节表示. 标准IO文件流

[APUE]标准IO库(下)

一.标准IO的效率 对比以下四个程序的用户CPU.系统CPU与时钟时间对比 程序1:系统IO 程序2:标准IO getc版本 程序3:标准IO fgets版本 结果: [注:该表截取自APUE,上表中"表3-1中的最佳时间即<程序1>","表3-1中的单字节时间指的是<程序1>中BUFSIZE为1时运行时间结果",fgetc/fputc版本程序这里没放出] 对于三个标准IO版本的每一个其用户CPU时间都大于最佳read版本,因为每次读一个字符

读书笔记-APUE第三版-(5)标准IO库

ISO C标准I/O库使用流的概念读写文件.流是对数据传输的抽象,可以把流理解为从起点到终点间的字节序列. 标准I/O库通过维护进程空间内的缓冲区,减少read/write系统调用次数来提高I/O效率.之前介绍的Unbuffered I/O和文件描述符fd打交道,标准I/O则使用FILE指针. typedef struct{ short level;/*缓冲区满程度*/ unsigned flags;/*文件打开状态标志*/ char fd;/*文件描述符*/ unsigned char hol

文件IO函数和标准IO库的区别

摘自 http://blog.chinaunix.net/uid-26565142-id-3051729.html 1,文件IO函数,在Unix中,有如下5个:open,read,write,lseek,close.称之为不带缓存的IO(unbuffered I/O).不带缓存指的是每个read,write都调用内核中的一个系统调用. 2,标准IO库,由ANSI C标准说明.标准IO库处理很多细节.例如缓存分配,以优化长度执行IO等.标准的IO提供了三种类型的缓存. (1)全缓存:当填满标准IO

C++ Primer 读书笔记: 第8章 标准IO库

第8章 标准IO库 8.1 面向对象的标准库 1. IO类型在三个独立的头文件中定义:iostream定义读写控制窗口的类型,fstream定义读写已命名文件的类型,而sstream所定义的类型则用于读写存储在内存中的string对象.在fstream和sstream里定义的美中类型都是从iostream头文件中定义的相关类型派生而来. 2. 流对象不能复制,因此不能存储在vector容器中 3. 形参或返回类型也不能为流类型.如果需要传递或返回IO对象,则必须传递或返回指向该对象的指针或引用.

嵌入式 Linux系统编程(三)——标准IO库

嵌入式 Linux系统编程(三)--标准IO库 与文件IO函数相类似,标准IO库中提供的是fopen.fclose.fread.fwrite等面向流对象的IO函数,这些函数在实现时本身就要调用linux的文件IO这些系统调用. 一.标准IO库函数的缓冲机制 由于IO设备的访问速度与CPU的速度相差好几个数量级,为了协调IO设备与CPU的速度的不匹配,对于块设备,内核使用了页高速缓存,即数据会先被拷贝到操作系统内核的页缓存区中,然后才会从操作系统内核的缓存区拷贝到应用程序的地址空间. 当应用程序尝

C++标准IO库

概述 先不要急着知道怎么用这个玩意,让我们一起先来看一看C++标准IO库的框架,其实挺有意思的!那就开始吧! C++的输入输出由标准库提供,标准库提供了一族类型,支持对文件.string对象.和控制窗口等设备的读写.一方面,这些IO类型都定义了如何读写内置类型的的值,另一方面,用户在设计类时可以仿照IO标准库设施读写内置类型的方式设计自己的输入输出操作. 1. 面向对象的IO库 面向对象是C++的一大特色,他的标准库自然也不例外,统统都是面向对象设计的.标准库使用了继承(inheritance)

标准IO库(详解)

文章转自:https://www.cnblogs.com/kingcat/archive/2012/05/09/2491847.html 自己在学习中,对此原文的基础之上进行补充. 什么是缓冲区 缓冲区又称为缓存,它是内存空间的一部分.也就是说,在内存空间中预留了一定的存储空间,这些存储空间用来缓冲输入或输出的数据,这部分预留的空间就叫做缓冲区. 缓冲区根据其对应的是输入设备还是输出设备,分为输入缓冲区和输出缓冲区. 为什么要引入缓冲区 比如我们从磁盘里取信息,我们先把读出的数据放在缓冲区,计算

在UNIX系统下使用IO库程序

在上一篇文章中,我们已经可以在UNIX下编译一个hello world 程序了.今天介绍UNIX系统下,如何在程序中使用IO库. 主体流程分为以下三步:(代码参考的是:<<C++ Primer>>) 第一步:新建文件,并命名为“Progr1.cpp” 第二步:在Progr1.cpp中写好main函数,并使用cin ,cout 这两个IO库函数.代码如下 #include <iostream>//告诉编译器要使用 iostream 库.尖括号里的名字是一个.头文件.程序使