C/C++学习----第七章 I/O及流

第七章 I/O及

    C++中使用类型安全的I/O操作,以对数据类型敏感的方式执行的。运算符<< 和>> 接收指定类型的数据,当接收到错误的数据类型时,系统会设置各种错误标志:输入类型错时,>>运算符会设置输入流的failbit状态位,如果操作错则设置badbit状态位,因此用户可以根据这些标志位来判断I/O操作的成败。C++提供了大量的用于格式化输入/输出的流操作算子,如设置值域、设置精度、设置和清除格式化标志、设置域填充字符、刷新流、在输出流中插入新行并刷新流、在输出流中插入空字符、跳过输入流中的空白字符等(参见C++程序设计教程7.6)。

7.1 I/O流

I/O流是一系列写到屏幕上或从键盘上读出的字节序列。在C++中,将I/O流定义为类,执行标准的输入输出操作时,一般使用I/O流cin作为输入,cout作为输出。在ios.h、iostream.h、istream.h、ostream.h以及streamb.h中可以找到I/O流的定义。iostream.h中定义了如下四个对象:

目的

举例

cin

键盘输入(stdin)

cin>>name;

cout

屏幕输出(stdout)

cout<<”Helllo World!”;

cerr

标准错误设备输出(stderr)

cerr<<”Error!”;

clog

标准错误缓冲输出(stderr)

clog<<”Error Log!”

 

I/O流关系图

istream类和ostream类中,分别实现了>>和<<操作符,在istream_withassign类和ostream_withassign类中,实现了赋值操作符(=)成员函数。

C++提供了格式化(高级)和无格式化(低级)I/O操作类。无格式化I/O操作(read、write)只在设备和内存间传输数据,特点是高速、大容量,但不太方便;格式化I/O操作是面向数据类型(系统类型和用户自定义类型)的,适合于大多数情况下I/O操作。

 

ios

istream

ostream

iostream

fstream

ostream_withassign

istream_withassign

ifstream

ofstream

 

 

 

 

 

 

 

 

 

 

 

 


C++格式化I/O类

类名

说明

ios类

输入、输出流的基类

istream类

添加>>操作符

ostream类

添加<<操作符

iostream类

添加读写操作

istream_withassign类

添加赋值(=)操作符

ostream_withassign类

添加赋值(=)操作符

ifstream类

添加打开和关闭功能

ofstream类

添加打开和关闭功能

fstream类

添加打开和关闭功能

stdiostream类

派生于ios类,添加向stdio中文件的连接

 

streambuf

filebuf

stdiobuf

 

 

 

 

 

 


C++非格式化I/O类

类名

说明

streambuf

缓冲I/O的基类,实际读写指针和简单的I/O操作

filebuf

添加打开和关闭功能

stdiobuf

添加向stdio中文件的连接

 

在大多数情况下,程序不会使用filebuf类型的对象,而是使用ifstream和ofstream对象。ios使用了一个指向streambuf类型对象的指针。

 

重定向I/O流C++将cout与cin I/O流与操作系统的标准输入和标准输出文件句柄相关联,可以使用这两种I/O流编写支持I/O重定向的程序。命令行中使用‘<’输入重定向,‘>’输出重定向。如果重新定义程序的输入或输出,I/O流连接将发生改变。cout和clog I/O流执行缓冲操作,写入这些流的输出不会立即出现在屏幕上,直到缓冲区满、程序结束、程序缓冲输出为止,或者在使用cout时直到程序执行从cin输入的操作为止。

#include

void main( void )

{

    ofstream output("out.dat");

    ofstream prn("PRN");

    cout<<"stream point to stdout"<<endl;

    cout = output; //重定向到文件

    cout<<"stream point to file"<<endl;

    cout = prn; //重定向到打印机

    cout<<"stream point to printer"<<endl;

}

7.2 文件I/O

7.2.1读写文本文件

    在fstream.h中,有ifstream、ofstream和fstream类的定义。为输出和输入文件打开举例:

#include

void main(void)

{

    char str[256];

    ofstream output("out.txt", ios::app); //为写打开文件

    output << "put out to file";

    output.close();

    ifstream input("in.txt", ios::in); //为读打开文件

    if(!input.fail())

       while(!input.eof()) {

           input.getline(str, sizeof(str));

           cout << str <<endl;

       }

    input.close();

    fstream ioput("io.txt", ios::in| ios::out); //为读、写打开文件

    ioput.close();

}

open成员函数支持以下几种不同的模式指示符:

打开模式

用途

Ios::app

为附加操作打开输出文件

Ios::ate

为输入或输出打开文件,文件指针置于文件结束位置

Ios::in

为输入打开文件,

Ios::out

为输出打开文件

Ios::noreplace

创建一新文件,若存在同名文件,打开失败

Ios::nocreate

打开一个现有文件,如果文件不存在,打开操作失败

Ios::trunc

删除现有文件,创建新文件

Ios::binary

为二进制读写打开文件

7.2.1二进制文件操作

    在缺省状态下,文件流操作是在文本模式下执行的。此时,不能进行二进制文件的读写操作。因为,在文本模式下读取文件时,会将ASCII码值26(CTRL-Z)当作文件结束符。而如果程序试图读取二进制文件时,很可能在文件中遇到该值,使得eof()函数取真值。为了解决这个问题,应该在二进制模式下打开文件。必须调用read从文件中读取数据,或调用write函数向文件写数据,此外,可以使用fail和good成员函数来确定I/O操作是否成功,调用close函数来关闭文件。

7.3 串流

    串流是一块包含字符的缓冲区(在内存区)。串流类和I/O流类的关系如下图:

istream

ostream

strstream

istrstream

ostrstream

iostream

Ios

 

 

 

 

 

 

 

 

 

 

 

 


用途

Istrstream

支持基于内存串的输入格式化操作

Ostrstream

支持基于内存串的输出格式化操作

Strstream

支持基于内存串的输入输出格式化操作

 

 

你可能感兴趣的:(ios,iostream,output,c++,input,stream)