第12章流类库和输入输出
【内容提要】
流的概念及流类库
输入输出的格式控制
输入与输出运算符的重载
文件操作
【重点与难点】
12.1 流的概念及流类库
12.1.1 流的概念
C++中的流是指数据从一个对象传递到另一个对象的操作。从流中读取数据称为提取操作,向流内添加数据称为插入操作。流在使用前要建立,使用后要删除。如果数据的传递是在设备之间进行,这种流就称为I/O流。C++专门内置了一些供用户使用的类,在这些类中封装了可以实现输入输出操作的函数,这些类统称为I/O流类。
C++流预定义了4个标准流类对象,它们可以直接用来输入输出。这些标准流类对象都包含在头文件iostream.h中。
istream cin; //与标准输入设备相关联的标准输入流。
ostream cout; //与标准输出设备相关联的标准输出流。
ostream cerr; //与标准错误输出设备相关联的非缓冲方式的标准输出流。ostream clog; //与标准错误输出设备相关联的缓冲方式的标准输出流。12.1.2 流类库
C++的流类库有两个平行的基类streambuf和ios,其它的流类都是从这两个基类直接或间接派生的。使用这些流类库时,必须包含相应的头文件。
ios类及其派生类为用户提供了使用流类的接口。以下给出ios类及其派生类的层次结构图。
ios
istream
ifstream
istream_withassign iostream
istrstream fstream
ostream strstream
ofstream sdiostream
ostream_withassign
ostrstream
图12.1 ios类的层次关系
12.2 输入输出的格式控制
C++仍可使用C中的printf()和scanf()进行格式化控制,同时又提供了两种格式化控制的方法,一是使用ios类中的有关格式控制的成员函数,二是使用执行格式化输入/输出的格式控制符。
12.2.1 用ios类的成员函数进行格式控制
使用这种方式进行格式控制主要是通过设置及清除格式状态标志、设置域宽、设置填充字符和设置输出精度的操作来完成的。
设置及清除格式状态标志
格式状态标志说明
ios::skipws跳过输入中的空白,用于输入
ios::left左对齐输出,用于输出
ios::right右对齐输出,用于输出
ios::internal在符号和数值之间填充字符,用于输出
ios::dec转换基数为十进制,用于输入或输出
ios::oct转换基数为八进制,用于输入或输出
ios::hex转换基数为十六进制,用于输入或输出
ios::showbase输出时显示基指示符(0表示八进制,0x或0X表示十六进制),用于输入或输出
ios::showpoint输出时显示小数点,用于输出
ios::uppercase输出时表示十六进制的x为大写,表示浮点数科学计数法的e为大写,用于输出
ios::showpos正整数前显示“+”符号,用于输出
ios::scientific用科学表示法显示浮点数,用于输出
ios::fixed用定点形式显示浮点数,用于输出
ios::unitbuf在输出操作后立即刷新所有流,用于输出
ios::stdio在输出操作后刷新stdout和stderr,用于输出
图12.2 格式状态标志
是,使状态标志字二进制表示中的不同位为1,它们共同组成状态标志字,存放在数据成员long x_flags中。在设置格式状态时可以通过按位或(|)运算将多个标志选项组合在一个long int型的值中。
②设置状态标志
使用成员函数setf设置参数所指定的格式标志,并返回long int型的标志设置值。
一般调用形式为:
流对象.setf(格式状态标志);
③清除状态标志
使用成员函数unsetf清除指定的标志并返回清除前的标志值。
一般调用形式为:
流对象.unsetf(格式状态标志);
④取状态标志
用成员函数flag,其不带参数时返回格式状态标志的当前设置(long int型值);带参数时按参数指定的格式设置标志,返回以前的标志设置值。
一般调用形式为:
流对象.flags();
流对象.flags(格式状态标志);
注意:flags()与setf()的区别是:setf()是在原有的基础上追加设置,不改变原有设置;
flags()使用新的设置覆盖原有的设置,改变了原有设置。
设置域宽
域宽是指输出字符的长度。用成员函数width()完成域宽的设置。
一般调用形式为:
流对象.width();
流对象.width(int w);
说明:
①不带参数时返回当前的域宽值;
②带参数时将域宽值设置为w,并返回设置前的域宽值。
设置填充字符
当输出值长度小于域宽时将剩余部分用设定的填充字符填满,缺省的填充字符为空格。
用成员函数fill设置填充字符。
一般调用形式为:
流对象.fill();
流对象.fill(char ch);
说明:
①不带参数时返回当前的填充字符;
②带参数时将填充字符设置为ch,并返回设置前的填充字符。
③使用填充字符函数时,必须与设置域宽函数配合使用,否则没有意义。
设置输出精度
用函数precision()设置浮点数输出时的显示精度。
一般调用形式为:
流对象. precision(int p);
12.2.2 用格式控制符进行格式控制
预定义的格式控制符(在第二章中已介绍)。
自定义的格式控制符
为输出流自定义格式控制符的一般形式为:
ostream &格式控制符名(ostream &stream)
{
//自定义代码
return stream;
}
为输入流自定义格式控制符的一般形式为:
istream &格式控制符名(istream &stream)
{
//自定义代码
return stream;
}
12.3 输入与输出运算符的重载
定义运算符“<<”重载函数的一般形式为:
ostream &operator<<(ostream &stream,类名对象名)
{
//操作代码
return stream;
}
定义运算符“>>”重载函数的一般形式为:
istream &operator>>(istream &stream,类名&对象名)
{
//操作代码
return stream;
}
说明:重载输入/输出运算符函数只能为非成员函数,一般被定义为类的友元。
12.4 文件操作
12.4.1 创建文件流
在C++中进行文件操作,要包含
ifstream fin;
ofstream fout;
fstream fio;
建立了流以后,就可以把某一个流与文件建立联系,进行文件的读写操作了。
12.4.2 文件的打开与关闭
可以在定义文件流对象的同时完成打开文件的工作,也可在定义文件流对象以后通过
open()函数完成。
open()函数是上述三个流类的成员函数,定义在fstream.h头文件中。
函数原型为:
void open(const unsigned char *,int mode,int dcces=filebuf::openprot);
说明:
①第一个参数用来传递文件名;
②第二个参数的值决定文件打开的方式,必须从下列值中选取:
ios::app //使输出追加到文件尾部,只用于输出
ios::ate //查找文件尾
ios::in //打开一个文件进行读操作,只用于输入
ios::nocreate //文件不存在,导致open()失败
ios::noreplace //若文件存在,则open()失败
ios::out //打开一个文件进行写操作,只用于输出
ios::trunc //删除同名文件
ios::binary //以二进制方式打开文件,缺省为文本方式
以上各值可以组合使用,之间用“|”分开。
③第三个参数的值决定文件的访问方式及文件的类别。
一般情况下,ifstream和ofstream流类的析构函数就可以自动关闭已打开的文件,也可用函数close()关闭文件,它是流类中的成员函数,没有参数,没有发返回值。
12.4.3 文件的读写
文件的顺序读写
①get()函数
函数原型:istream &get(unsigned char &ch);
作用:它从流中每次读出一个字节或一个字符放入引用ch&中。
②put()函数
函数原型:istream &put( char ch);
作用:它将一个字节或一个字符写入流中。
③read()函数
函数原型:istream &read(unsigned char *buf,int num);
作用:从相应的流读出num个字节或字符的数据,把他们放入指针所指向的缓冲
区中。buf是一个指向读入数据存放空间的指针,num说明要读入数据的字节或字
符数。
④write()函数
函数原型:ostream &write(const unsigned char *buf,int num);
作用:从buf所指向的缓冲区把num个字节的数据写到相应的流中。参数的含义、
调用及注意事项与read()相同。
文件的随机读写
完成定位操作的函数如下:
①函数seekg()
函数原型:isream &seekg(streamoff offset,seek_dir origin);
作用:用于输入文件,将文件的读指针从origin说明的位置移动offset个字节;
②函数seekp()
函数原型:osream &seekp(streamoff offset,seek_dir origin);
作用:用于输出文件,将文件的写指针从origin说明的位置移动offset个字节。
说明:origin的取值由三种情况:
ios::beg 从文件头开始,把文件指针移动由offset指定的距离。
ios::cur 从文件当前位置开始,把文件指针移动offset指定的距离。
ios::end 从文件尾开始,把文件指针移动由offset指定的距离。
③函数tellg()
函数原型:streampos tellg();
作用:用于输入文件,确定文件当前指针的位置
④函数tellp()
函数原型:streampos tellp();
作用:用于输出文件,确定文件当前指针的位置。
【典型例题】
例题1.在C++中,打开一个文件就是将一个文件与一个_________建立关联;关闭一个文件就是取消这种关联。
解答:
C++的I/O系统是通过一种称为流的机制来实现文件和控制台的I/O操作。简单地说,在C++中,输入输出操作是通过流来完成的。而文件流以磁盘文件以及其他可按文件方式进行管理的外部设备为输入输出对象。每个文件流都应当与一个打开的文件相联系;关闭一个文件就是取消这种联系。答案为:流。
例题2.进行外交操作时需要包含()头文件。
(a)iostream (b)fstream (c)stdio (d)stdlib
解答:
文件流是文件流类的实例对象。C++系统在头文件fstream中定义了3个文件流类:ifstream,ofstream和fstream。要创建文件流,必须包含头文件fstream。并声明所创建的文件流是上述哪个类的实例对象。因此,有关文件I/O类的说明包含在fstream头文件中。答案为:b。
例题3.当使用ifstream流类定义一个流对象并打开一个磁盘文件时,文件的隐含打开方式为()。
(a)ios::in (b)ios::out (c)ios::trunc (d)ios::binary
解答:
当使用ifstream流类定义一个流对象并打开一个磁盘文件时,文件的隐含打开方式为ios::in;当使用ofstream流类定义一个流对象并打开一个磁盘文件时,文件的隐含打开方式为ios::out。答案为:a。
例题4.下列函数中,()是对文件进行写操作的。
(a)read() (b)seekg() (c)get() (d)put()
解答:
read()的功能是输入指定数量的字节存入指定的字符空间中;seekg()的功能是按指定方式将输入定位于指定的相对位置处;get()的功能是提取并返回当前输入位置的字符代码,或将提取的字符存入指定变量中;put()的功能是把一个字符写到输出流中。答案为:d。
例题5.cin是__________的一个对象,处理标准输入。cout,cerr和clog是________的对象,cout处理标准输出,cerr和clog都处理标准出错信息,只是________输出不带缓冲,________输出带缓冲。
解答:
C++流预定义了4个流,它们是cin,cout,cerr和clog。它们可以直接用来输入输出,与这4个流所联结起的具体设备是:(1)cin:与标准输入设备相关联。(2)cout:与标准输出设备相关联。(3)cerr:与标准错误输出设备相关联(非缓冲)。(4)clog:与标准错误输出设备相关联(缓冲)。因此,可知cin是istream的一个对象,处理标准输入。cout,cerr和clog 是ostream的对象,cout处理标准输出,cerr和clog都处理标准出错信息,只是cerr输出不带缓冲,clog输出带缓冲。答案为:istream、ostream、cerr、clog。
例题6.下面是一个将文本文件readme中的内容读出并显示在屏幕上的示例,请完成该程序。
#include
void main()
{
char buf[80];
ifstream me(“c:\\readme”);
while(____①_____)
{
me.getline(____②_____,80);
cout< } me.close(); } 解答: while循环中需要加循环终止条件,在①处应该判断文件是否结束,应填入“!me.eof()”;根据getline()函数的原型可知,此处应填入一个字符串变量,故填入“buf”。即答案为:①!me.eof()、②buf。 例题7.下面的程序向C盘的new文件写入内容,然后把该内容显示出来,试完成该程序。#include void main() { char str[100]; fstream f; ___________①_________; f<<”hello world”; f.put(‘\n’); f.seekg(0); while( _____②_________) { f.getline(str,100);cout< } ______③___________; } 解答: 向文件写内容前首先需要打开该文件并指明需要的输入输出操作;在使用完毕后应当关闭该文件。在读到文件结尾时应当结束读取操作。故本题答案为: ①f.open(“c:\\new”,ios::in|ios::out)、②!f.eof()、③f.close()。 例题8.运行下列程序结果为()。 #include #include void main() { int a=12; double b=314159.26; cout< cout.setf(ios::oct|ios::showbase); cout< cout.precision (8); cout<<-b< cout.setf(ios::scientific|ios::uppercase|ios::left); cout.width(20); cout.fill('*'); cout<<-b< cout.width(20); cout.setf(ios::internal); cout<<-b< cout.precision(6); cout.fill(' '); cout.unsetf(ios::scientific|ios::uppercase|ios::left|ios::internal); } 解答: 本题主要考查用ios类的成员函数进行格式控制的使用方法。参见本章重点与难点部分的介绍。本题答案为: 12 014 -314159.26 -314159.260E+005**** -****3.14159260E+005 【习题】 一、选择题 1.运行下列程序结果为()。 #include int main( ) { cout.width(6); cout.fill('*'); cout << 'a'<<1 << endl; return 0; } (a)*****a*****1 (b)*****a1 (c)a*****1***** (d)a*****1 2.下面关于C++流的叙述中,正确的是()。 (a)cin是一个输入流对象。 (b)可以用ifstream定义一个输出流对象。 (c)执行语句序列char *y="PQMN"; cout< (d)执行语句序列char x[80]; cin.getline(x,80); 时,若键入Happy new year,则x中的字符串是"Happy"。 3.若磁盘上已存在某个文本文件,它的全路径文件名为d:\kaoshi\test.txt,则下列语句中不能打开这个文件的是()。 (a)ifstream file(“d:\kaoshi\test.txt”); (b)ifstream file(“d:\\kaoshi\\test.txt”); (c)ifstream file;file.open(“d:\\kaoshi\\test.txt”); (d)ifstream *pFile=new ifstream(“d:\\kaoshi\\test.txt”); 4.语句ofstream f(“SALARY.DAT”,ios_base::app)的功能是建立流对象f,并试图打开文件SALARY.DAT与f关联,而且()。 (a)若文件存在,将其置为空文件;若文件不存在,打开失败 (b)若文件存在,将文件指针定位于文件尾;若文件不存在,建立一个新文件 (c)若文件存在,将文件指针定位于文件首;若文件不存在,打开失败 (d)若文件存在,打开失败;若文件不存在,建立一个新文件 5.C++流中重载了运算符<<,它是一个()。 (a)用于输出操作的成员函数(b)用于输入操作的非成员函数 (c)用于输入操作的成员函数(d)用于输出操作的非成员函数 二、填空题 1.运行以下程序输出结果为______________________。 #include using namespace std; int main( ) { cout< cout< cout< return 1; } 2.运行下列程序输出结果为______________________。 #include using namespace std; class point { double x,y; public: void set(double,double); double getx(); double gety(); }; void point::set(double i,double j) { x=i;y=j; } double point::getx(){return x;} double point::gety(){return y;} ostream& operator<<(ostream &out,point &p1) { return out<<'('< } int main( ) { point p1; double x=3.1,y=4.5; p1.set(x,y); cout<<"p1="< return 1; } 3.重载输入/输出运算符函数一般被定义为类的____________函数。 4.成员函数________和________用于设置和清除格式状态标志。 5.标准错误流的输出发送给流对象______或______。 6.运行如下程序,当输入”hello mary!”时,输出为_________________。 #include void main() { char str[100]; cin>>str; cout< } 7.进行文件操作时需要包含头文件__________________。 8.cin是__________的一个对象,处理标准输入。cout、cerr、clog是__________的对象。 9.文件流的成员函数good()的作用是_____________________;fail()的作用是_____________________;bad()的作用是_________________________。 10.运行下列程序的结果为______________________。 #include void main(void) { int i; for (i = 0; i < 3; i++) { cout.fill('*'); cout.width(5 + i); cout << i << '\n'; } } 11.运行下列程序的结果为_____________________。 #include #include void main(void) { int i; cout << "Right justification\n"; for (i = 0; i < 3; i++) { cout.width(5); cout << setiosflags(ios::right) << i; } cout << "\nLeft justification\n"; for (i = 0; i < 3; i++) { cout.width(5); cout << setiosflags(ios::left) << i; } } 12.运行下列程序结果为_____________________。 #include void main(void) { cout.setf(ios::hex); cout.setf(ios::showbase); cout << 100; } 三、编程题 1.编写程序,将0-255之间的所有字符写入文件chars.txt中。 2.编写程序,将文件old.txt中的所有行后加上句号后写入文件new.txt中。 【参考答案】 一、选择题 1.b 2.a 3.a 4.b 5.d 二、填空题 1.1 true 2.p1=( 3.1, 4.5) 3.友元 4.setf、unsetf 5.cerr、clog 6.hello 7.fstream.h 8.istream、ostream 9.判断刚进行的操作是否成功,判断刚进行的操作是否失败,判断是否进行了非法操作。 10.****0 *****1 ******2 11. Right justification 0 1 2 Left justification 0 1 2 12.0x64 三、编程题 1.参考程序如下: #include #include void main() { ofstream out("chars.txt"); if(!out) { cout<<"不能打开输出文件"< } int ch; for(ch=0;ch<=255;ch++)out.put((char)ch); out.close(); } 2.参考程序如下: #include #include void main() { fstream file1,file2; char buffer[100]; int i=0; file1.open ("old.txt",ios::in); if(!file1) {cout<<"can not open this file!"< file2.open("new.txt",ios::out); while(!file1.eof()) { file1.getline(buffer,sizeof(buffer)); file2< } cout<<"OK!"< } 注意:每道题的难度等级不同,*越多,难度等级越高。可以根据自己的能力,选做恰当难度的题。 8.1改写第五章编程练习5.4题的程序,使该程序在程序结束之前,先判断字典内容是否发 生了变化(单词的添加、修改、删除)。如果字典内容已经被修改,则提示是否保存修改后的新字典;若选择保存,则将字典的全部内容写入一个纯文本文件,该文件可以命名为dictionary.txt。每次程序重新运行时,先尝试打开dictionary.txt。如果该文件存在,则打开文件,并从该文本文件中输入产生一个字典。 难度等级:** 8.2编写一个用于统计英文纯文本文件的各项信息:文件内容的总字符数(包括标点符号), 单词个数,文本行数。 要求: 1.提示用户输入一个扩展名为.txt的纯文本文件名,如果指定文件存在,则打开该文 件,否则显示错误提示信息。 2.统计文件内容的上述信息,并显示所统计的信息。信息的显示格式自行确定,例如 可以按如下格式显示: 文件名:Information.txt 字符数:4854 单词数:853 文本行数:56 3.每个文件的信息显示后,提示用户是否继续统计其他文本文件,如果继续,则重复 1和2中的操作。 提示: 1.判断文本行的依据可以是每行的结尾应为‘\n’。 难度等级:* 8.3编写一个程序用于某大学的某信息专业学生的基础课成绩的录入、显示和相应数据文件 的读写。 要求: 1.成绩的按如下顺序录入: ⑴在学生成绩录入之前,先通过输入确定基础课程的门数和课程名称。例如: 基础课程1:高等数学 基础课程2:大学物理 基础课程3:大学英语 基础课程4:C语言程序设计 基础课程5:数据结构 … ⑵每个学生的成绩录入的内容包括学生的姓名、学号、性别和各门课程的成绩。成 绩按照A,B,C,D四个等级划分。录入格式可以参照如下: 姓名:李建国 学号:200410001 性别:男 高等数学:C 大学物理:B 大学英语:C C语言程序设计:B 数据结构:A … 2.保存学生成绩数据的文件的种类和结构、内容如下 ⑴课程信息索引文件courses.inx用于保存所有课程的索引信息,每门课程的索 引信息由课程索引序号和课程名组成。例如: 课程序号课程名 1高等数学 2大学物理 3大学英语 4C语言程序设计 5数据结构 … 注意,课程门数不得少于5门。 ⑵学生信息文件student.inx用于保存所有学生的索引信息,每个学生的索引信息 由学号和学生基本信息(姓名、性别)组成。例如: 学生学号学生基本信息 200410001李建国,男 … ⑶分课程成绩数据索引文件XXX.inx用于保存一门课程的所有学生成绩的索引信 息,每个学生的成绩索引信息由学号和成绩等级组成。每门课程有一个成绩数据 索引文件,文件名XXX由课程名确定。例如: 文件名:“高等数学.inx” 学生学号成绩等级 200410001C 实验十一流类库与输入/输出(2学时) 一、实验目的 1.熟悉流类库中常用的类及其成员函数的用法。 2.学习标准输入输出及格式控制。 3.学习对文件的应用方法(二进制文件、文本文件)。 二、实验任务 1.观察以下程序的输出,注意对输出格式的控制方法; //labll—1.cpp #include 第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 cout<<"Please enter a sentence:"< 第12章流类库和输入输出 【内容提要】 流的概念及流类库 输入输出的格式控制 输入与输出运算符的重载 文件操作 【重点与难点】 12.1 流的概念及流类库 12.1.1 流的概念 C++中的流是指数据从一个对象传递到另一个对象的操作。从流中读取数据称为提取操作,向流内添加数据称为插入操作。流在使用前要建立,使用后要删除。如果数据的传递是在设备之间进行,这种流就称为I/O流。C++专门内置了一些供用户使用的类,在这些类中封装了可以实现输入输出操作的函数,这些类统称为I/O流类。 C++流预定义了4个标准流类对象,它们可以直接用来输入输出。这些标准流类对象都包含在头文件iostream.h中。 istream cin; //与标准输入设备相关联的标准输入流。 ostream cout; //与标准输出设备相关联的标准输出流。 ostream cerr; //与标准错误输出设备相关联的非缓冲方式的标准输出流。ostream clog; //与标准错误输出设备相关联的缓冲方式的标准输出流。12.1.2 流类库 C++的流类库有两个平行的基类streambuf和ios,其它的流类都是从这两个基类直接或间接派生的。使用这些流类库时,必须包含相应的头文件。 ios类及其派生类为用户提供了使用流类的接口。以下给出ios类及其派生类的层次结构图。 ios istream ifstream istream_withassign iostream istrstream fstream ostream strstream ofstream sdiostream ostream_withassign ostrstream 图12.1 ios类的层次关系 12.2 输入输出的格式控制 C++仍可使用C中的printf()和scanf()进行格式化控制,同时又提供了两种格式化控制的方法,一是使用ios类中的有关格式控制的成员函数,二是使用执行格式化输入/输出的格式控制符。 12.2.1 用ios类的成员函数进行格式控制 使用这种方式进行格式控制主要是通过设置及清除格式状态标志、设置域宽、设置填充字符和设置输出精度的操作来完成的。 设置及清除格式状态标志 格式状态标志说明 ios::skipws跳过输入中的空白,用于输入 ios::left左对齐输出,用于输出 实验 6 C++的流类库与输入输出 一、实验目的 1. 掌握C++格式化的输入输出方法。 2. 掌握重载运算符“<<”和“>>”的方法。 3. 掌握磁盘文件的输入输出方法。 二、实验准备及要求 在开始实验前,应回顾或复习相关内容。 需要一台主算机,其中安装有Visual C++ 6.0集成开发环境软件。 三、实验内容与结果 1. 下面给出的test7_1_1.cpp程序用于打印九九乘法表,但程序中存在错误。请上机调试,使得此程序运行后,能够输出如下所示的九九乘法表。 * 1 2 3 4 5 6 7 8 9 1 1 2 2 4 3 3 6 9 4 4 8 12 16 5 5 10 15 20 25 6 6 12 18 24 30 36 7 7 14 21 28 35 42 49 8 8 16 24 32 40 48 56 64 9 9 18 27 36 45 54 63 72 81 //test7_1_1.cpp #include cout< #include 1.概念填空题 1.1头文件iostream中定义了4个标准流对象cin,cout,cerr,clog。其中标准输入流对象为cin,与键盘连用,用于输入;cout为标准输出流对象,与显示器连用,用于输出。 1.2用标准输入流对象cin与提取操作符>>连用进行输入时,将空格与回车当作分隔符,使用get()成员函数进行输入时可以指定输入分隔符。 1.3每一个输入输出流对象都维护一个流格式状态字,用它表示流对象当前的格式状态并控制流的格式。C++提供了使用格式控制函数与操作子函数来控制流的格式的方法。 1.4 C++根据文件内容的数据格式可分为两类:文本文件和二进制文件。前者存取的最小信息单位为字节,后者记录。 1.5文件输入是指从文件向内存读入数据;文件输出则指从内存向文件输出数据。文件的输入输出首先要打开文件;然后进行读写;最后关闭文件。 1.6文本文件是存储ASCII码字符的文件,文本文件的输入可用cin从输入文件流中提取字符实现。文本文件的输出可用cout将字符插入到输出文件流来实现。程序在处理文本文件时需要(需要/不需要)对数据进行转换。 1.7二进制文件是指直接将计算机内的数据不经转换直接保存在文件中。二进制文件的输入输出分别采用read()、write() 成员函数。这两个成员函数的参数都是2个,分别表示读写缓冲区和字节数。 1.8设定、返回文件读指针位置的函数分别为seekg,tellg;设定、返回文件写指针位置的函数分别为seekp,tellp。 2 简答题 2.1 为什么cin输入时,空格和回车无法读入?这时可改用哪些流成员函数? 2.2 文件的使用有它的固定格式,试做简单介绍。 2.3 在ios类中定义的文件打开方式中,公有枚举类型open_mode的各成员代表什么文件打开方式? 2.4 简述文本文件和二进制文件在存储格式、读写方式等方面的不同,各自的优点和缺点。 2.5 文本文件可以按行也可以按字符进行复制,在使用中为保证能完整复制要注意哪些问题? 2.6 文件的随机访问为什么总是用二进制文件,而不用文本文件? 2.7 怎样使用istream和ostream的成员函数来实现随机访问文件? 3.选择题 3.1要进行文件的输出,除了包含头文件iostream外,还要包含头文件(C )。 A.ifstream B.fstream C.ostream D.cstdio 3.2执行以下程序: char *str; cin>>str; cout< 实验报告 课程:面向对象技术学号:1010431079 姓名:郝祥海 班级:2010级计算机软件(嵌入式系统)1班 教师:周晓 计算机科学与技术系 实验八流类库与输入输出 一、实验目的及要求 1.熟悉流类库中常用的类及其成员函数的用法; 2.掌握标准输入/输出及格式控制; 3.掌握对文件的应用方法。 二、实验环境 硬件:计算机软件:Microsoft Visual C++ 三、实验内容 1.声明一个学生类数组,输入数据,显示出来,使用I/O流把此数组的内容写入磁盘文件,再显示出文件内容。学生类具有的属性如下:姓名name、学号number、班号classno、性别sex、出生日期birthday,其中“出生日期”声明为一个“日期”类内嵌子对象。 四、实验结果(附截图) 五、总结 通过本次实验,我了解到流是一种抽象,它负责在数据的生产者和消费者之间建立联系,并管理数据的流动。我对文件的输入输出流有了更深的了解。 六、附录(源程序清单) #include public: Student(string n,int nu,int cl,char s); string GetName(){return name;} int GetNumber(){return number;} int GetClassno(){return classno;} char GetSex(){return sex;} private: string name; int number; int classno; char sex; }; Student::Student(string n,int nu,int cl,char s):name(n),number(nu),classno(cl),sex(s){} int main(){ Student a[3] = {Student("Frank",101,1,'M'), Student("Lucy",201,2,'W'), Student("Mike",301,3,'M')}; int i; for(i=0;i<3;i++) { cout << "姓名\t" << a[i].GetName() << "\t学号\t" << a[i].GetNumber() << "\t班号\t" << a[i].GetClassno() <<"\t性别\t"< 实验十一 流类库与输入/输出 1、 实验目的 1. 熟悉流类库中常用的类及其成员函数的用法。 2. 学习标准输入输出及格式控制; 3. 学习对文件的应用方法(二进制文件、文本文件)。 2、 实验任务 1. 观察以下程序的输出,注意对输出格式的控制方法; //lab11_1.cpp #include D(T.setf(ios::left, ios::adjustfield);) D(T.fill('0');) D(T << "fill char: " << T.fill() << endl;) D(T.width(8);) T << i << endl; D(T.setf(ios::right, ios::adjustfield);) D(T.width(8);) T << i << endl; D(T.setf(ios::internal, ios::adjustfield);) D(T.width(8);) T << i << endl; D(T << i << endl;) // Without width(10) D(T.unsetf(ios::showpos);) D(T.setf(ios::showpoint);) D(T << "prec = " << T.precision() << endl;) D(T.setf(ios::scientific, ios::floatfield);) D(T << endl << f << endl;) D(T.setf(ios::fixed, ios::floatfield);) D(T << f << endl;) D(T.setf(0, ios::floatfield);) D(T << f << endl;) D(T.precision(16);) D(T << "prec = " << T.precision() << endl;) D(T << endl << f << endl;) D(T.setf(ios::scientific, ios::floatfield);) D(T << endl << f << endl;) D(T.setf(ios::fixed, ios::floatfield);) D(T << f << endl;) D(T.setf(0, ios::floatfield);) D(T << f << endl;) D(T.width(8);) T << s << endl; D(T.width(36);) T << s << endl; D(T.setf(ios::left, ios::adjustfield);)Microsoft Word - 输入输出流类库编程练习题 - 首都
实验十一 流类库与输入/输出
第9章流类库与输入输出
第12章流类库和输入输出概论
实验六C++的流类库与输入输出
c++流类库与输入输出习题答案
实验八 流类库与输入输出
面向对象程序设计(4.2.3)--流类库与输入输出实验