第9章流类库与输入输出9.1 本章提要(1)C++语言提供一个用于输入/输出(I/O)操作的类族,这些操作是以对数据敏感的方式实现的。
类族提供了对预定义类型进行输入/输出操作的能力,程序员也可以利用这个类族进行自定义类型的输入/输出操作。
(2)标准输出操作方法①将插入符作用在流对象cout上,可输出显示整型数、浮点数,字符和字符串。
②使用成员函数put( )可输出一个字符③使用成员函数write( )可输出一个字符串(3)标准输入操作方法①将提取符作用在流对象cin上,可输入整型数、浮点数、字符和字符串。
②使用成员函数get( )可输入一个字符,使用成员函数getline( )可输入—行字符。
③使用成员函数read( )可读取一个字符串。
(4)格式化输入输出的两种方式①使用标志字和成员函数②使用操作子(5)磁盘文件的输入和输出,包括:①磁盘文件的打开和关闭操作②文本文件的读写操作③二进制文件的读写操作④随机访问数据文件9.2 程序举例下面是一个展示用不同方法(使用重载运算符和成员函数)对标准的输入输出流对象(cin和cout)进行操作的例子。
例9-1 用不同方法操作流对象//ch9_1.cpp 标准设备的输入输出#include <iostream.h>void main(){char buffer1[80],buffer2[80],buffer3[80];cout<<"Please enter a sentence:"<<endl;cin>>buffer1;cout<<buffer1<<endl;cin.getline(buffer1,80); //clear buffercout<<"Please enter a sentence:"<<endl;cin.getline(buffer2,80);cout<<buffer2<<endl;cout<<"Please enter a sentence:"<<endl;cin.read(buffer3,10);cout.write(buffer3,cin.gcount());}运行结果:Please enter a sentence:Welcome to C++.↙WelcomePlease enter a sentence:Welcome to C++.↙Welcome to C++.Please enter a sentence:Welcome to C++.↙Welcome to在这个程序中,出现了以下几个对输入输出流进行操作的成员函数。
getline():读取一行字符串read():读取指定字符个数的字符中write():输出显示指定字符个数的字符串。
下面是一个使用格式化标志进行格式控制操作的例子。
例9-2 使用格式化标志进行格式控制//ch9_2.cpp 使用格式化标志进行格式控制#include "iostream.h"#include <iomanip.h>void main(){//设置整数流的格式和基数int x=123;cout<<"dec: "<<dec<<x<<" , "<<"oct: "<<oct<<x<<" , "<<"hex: "<<hex<<x<<endl;cout<<setiosflags(ios::showbase) //设置为显示基数符号<<"dec: "<<dec<<x<<" , "<<"oct: "<<oct<<x<<" , "<<"hex: "<<hex<<x<<endl;//设置浮点数流的格式double a=0.1234567,b=5.5614e8;cout<<a<<','<<b<<endl;cout.setf(ios::scientific,ios::floatfield); //设置为科学表示法cout<<a<<','<<b<<endl;cout.unsetf(ios::scientific); //清除科学表示法cout<<a<<','<<b<<endl;cout.setf(ios::fixed,ios::floatfield); //采用定点数形式cout<<a<<','<<b<<endl;cout.unsetf(ios::fixed); //清除定点数形式//设置大小写控制cout<<5.67e5<<','<<hex<<686970<<endl;cout.setf(ios::uppercase); //设置为大写cout<<5.67e5<<','<<hex<<686970<<endl;//设置对齐方式和填充字符int y=565134;cout.fill('*'); //采用*为填充字符cout<<dec<<setw(10)<<y<<endl;cout.setf(ios::left,ios::adjustfield); //设置为左对齐cout<<setw(10)<<y<<endl; //设置输出宽度为10 cout.setf(ios::right,ios::adjustfield); //设置为右对齐cout.fill(' '); //采用空格为填充字符cout<<setw(10)<<y<<endl;}运行结果:dec: 123 , oct: 173 , hex: 7bdec: 123 , oct: 0173 , hex: 0x7b0.123457,5.5614e+0081.234567e-001,5.561400e+0080.123457,5.5614e+0080.123457,556140000.000000567000,0xa7b7a567000,0XA7B7A****565134565134****565134例9-3 使用操作子设置输出宽度和输出精度的例子//ch9_3.cpp 关于宽度与精度的例子#include <iostream.h>#include <iomanip.h>void main(){int a=12345;cout<<setw(10)<<a<<endl; //输出宽度为10cout.width(8); //输出宽度为8cout<<a<<endl;cout<<a<<endl;const double PI=3.1415926;for(int i=1;i<8;i++){cout<<setprecision(i)<<PI<<endl; //设置不同的输出精度}}运行结果如下:12345123451234533.13.143.1423.14163.141593.141593下面这个例子展示了对文本文件的处理操作,它从一个已存的文件读出数据,给每一行加上标号后输往新文件和屏幕。
例9-4 给文本文件加行号//ch9_4.cpp 文本文件的操作#include <iostream.h>#include <fstream.h>#include <iomanip.h>#include <stdlib.h>void main(){ifstream in("abc.txt");if(!in){cout<<"Can't open the file abc.txt!"<<endl;abort();}ofstream out("abc_line.txt");if(!out){cout<<"Can't open the file abc_line.txt!"<<endl;abort();}char buffer[80];int lineNumber=1;while(in.getline(buffer,80)){out.setf(ios::right,ios::adjustfield);out<<setw(1)<<lineNumber<<'.'<<buffer<<endl; //输往文件cout<<setw(1)<<lineNumber<<'.'<<buffer<<endl; //输往屏幕lineNumber++;}}如果已存在文件“abc.txt”,并且其中有三行内容,分别为“Hi”、“Welcome to C++.”和“You will succeed.”,那么在程序运行之后,屏幕上将有如下输出,同时,这些内容还将保存在文件“abc_line.txt”中。
1.Hi!2.Welcome to C++.3.You will succeed.下面这个例子展示了对二进制文件的操作,它从数组中读取一组数据放到文件中,再从文件中读取一组数据放到另一数组中,并把它显示出来。
例9-5 二进制文件的操作//ch9_5 二进制文件打开关闭与读写的例子#include <iostream.h>#include <fstream.h>#include <stdlib.h>#include <math.h>const double PI=3.14159;void main(){double sout[7],sdat[7];int i,angle;ofstream out("sin.dat");if(!out){cout<<"Can't open the file!"<<endl;abort();}for(i=0,angle=0;i<7;i++){sdat[i]=sin(double(angle)*PI/180);angle+=15;}out.write((unsigned char*)sdat,sizeof(sdat));out.close();ifstream in("sin.dat");if(!in){cout<<"Can't open the file!"<<endl;abort();}in.read((unsigned char*)sout,sizeof(sout));for(i=0,angle=0;i<7;i++){cout<<"sin";cout.setf(ios::right,ios::adjustfield);cout<<angle<<"°="<<sout[i]<<endl;angle+=15;}in.close();}程序的输出结果。