C++标准库之IO库(一)

概述

C++语言与C语言一样,语言本身并不提供输入输出的支持,它们实现输入输出都是通过标准库来完成的。C语言的标准库提供一系列可以用来实现输入输出的函数,C++标准库则提供一系列类和对象来完成输入输出的功能,并且提供了流的概念,标准库中的IO类都是流概念的类。C++标准库中80%的内容属于STL,而IO库并不属于这80%。IO库体现的是面向对象的思想,但是有可能IO类也是基于模板实现的。

IOStreams基本概念

C++ IO由流(一种特殊的类的对象)完成,所谓的流是指按时间顺序生成的字符序列。按照面向对象的思想,流是由某个类别(类)定义出来的具有特定性质的对象。输出操作被定义为数据流入stream,输入操作被定义为数据流出stream。比较基础的类为istream类和ostream类,分别表示输入流和输出流。

全局性的stream对象

IOStream程序库定义了数个型别为istream和ostream的全局对象,它们对应于标准的IO通道(channels),分别是cout,cin,clog,cerr。可以使用重定向的机制使不同的全局对象指向不同的位置。

Stream操作符

利用操作符重载的机制,stream类可以将<<和>>这两个移位操作符重载为负责输入输出的操作符。

操控器

控制stream类进行某些操作,如endl。将std::endl赋给输出流会打印’\n’,同时利用flush来刷新缓冲区。还有std:ends等。

标准库的头文件组织以及继承关系

IO库由三个头文件组成定义,分别是iostream,fstream,sstream。Iostream中定义读写控制窗口的类型,fstream中定义读写已命名文件的类型,而sstream中定义读写内存中string对象的类型。fstream和sstream中定义的每种类型都是从iostream头文件中定义的相关类型中派生来的。

头文件                                   类型

iostream                               istream:从流中读取

ostream: 写到流中去

iostream:对流进行读写

fstream                                 ifstream:对文件进行读

ofstream:对文件进行写

fstream:对文件进行读写

sstream                                 istringstream:从string对象进行读取

ostringstream:读string对象写

stringstream:对string对象进行读写

条件状态(流状态)

输入输出流有状态,最简单的检查状态的方法是检查状态的真值。当输入或者输出流有错误时,流为错误状态。此时if(cin)为false,否则为if(cin)为true。

IO标准库管理一系列函数和条件状态(condition state)成员,用来标记给定的IO对象是否处于可用状态,或者碰到了哪些特定的错误。下面是标准库定义的一组函数和标记,提供访问和操纵流状态的手段。

strm:iostate:机器相关的整型名,由各个iostream类定义,用来定义条件状态,每个iostream类都有一个此类型的状态成员,用来标记流状态,它是以二进制位的形式存在的,使用clear和setstate进行管理。strm:badbit,strm:failbit,strm:eofbit,都是strm:iostate类型的值,用来标志特定的内容。标准库同时提供了一系列管理流状态的函数,根据条件状态的不同返回不同的结果或者来设置流状态。如s.eof(),s.fail(),s.bad(),s.good()等。一个使用状态类的例子:

int ival;

while(cin>>ival,!cin.eof())

{

if(cin.bad())

throw runtime_error(“IO stream corrupted”);

if(cin.fail())

{

cerr<<”bad data,try again”;

cin.clear(istream:failbit);

continue;

}

}

输出缓冲区的管理

每个IO对象管理一个缓冲区,用来存储程序读写的数据。缓冲区被刷新意味着缓冲区的内容被写入到真实的输出设备或者文件。刷新缓冲区有5种方式,两种默认的被动方式,三种主动的方式。默认的方式是程序正常退出时,以及缓冲区满时。主动的方式是使用操纵符,如endl,ends,flush等。使用unitbuf开始,则输出时每个输出完毕都刷新,使用nounitbuf结束。这个方式相当于设置流的状态。第三种主动方式是使用tie将输入输出流进行绑定。Cout和cin被绑定了。这样每次输入时都使得cout的缓冲区被刷新。建立绑定和解绑定方式为:cin.tie(&cout),cin.tie(0)。绑定函数为流的成员函数。

时间: 2024-08-03 09:42:15

C++标准库之IO库(一)的相关文章

C++标准库之IO库

个人理解: 1)形成:程序——流——其他设备 的一个结构.其他设备可以指:程序,文件,外接设备等一切. 2)输入流: 从 流 到 程序.另一理解:其他设备 到 流.个人倾向于使用前者.输出类同. 3)基本流有:基本流(iostream),文件流(iofstream),字符流(iostringstream).具体使用 baidu or google. 一些细节: 1)out模式(ofstream:out)打开文件,会删除已有文件数据. 2)iostream又名:控制台IO.大概是因为此流类默认关联

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

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

Unix环境之标准IO库

UNIX的文件IO都是针对文件描述符的,而标准IO的操作则是围绕流进行的.当一个流最初被创建时,它并没有定向.若在未定向的流上使用一个多字节IO函数,则将该流的定向设置为宽定向:若在未定向的流上使用一个单字节IO函数,则将该流的定向设置为字节定向. stdio.h定义了三个标准流,stdin.stdout和stderr,分别是标准输入.标准输出和标准出错. 缓冲-- 标准IO库提供缓冲的目的是尽可能减少使用read和write调用的次数.它也对每个IO流自动地进行缓冲管理,从而避免了应用程序需要

UNIX高级环境编程(7)标准IO函数库 - 二进制文件IO,流定位,创建临时文件和内存流

? 1 二进制IO(Binary IO) 在前一篇我们了解了逐字符读写和逐行读写函数. 如果我们在读写二进制文件,希望以此读写整个文件内容,这两个函数虽然可以实现,但是明显会很麻烦且多次循环明显效率很低. 为了应对这种场景,标准IO库提供了fread和fwrite函数. 函数声明: #include <stdio.h> size_t fread(void *restrict ptr, size_t size, size_t nobj, FILE *restrict fp); size_t fw

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

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

文件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

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

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