一、填空题
(1)在C++ 的输人输出系统中,最核心的对象是 流 。执行输人和输出操作的类体系叫做 流类 。
(2)当实际进行I/O操作时,cin 与 标准输入 设备相关联。
(3) C++的流类库预定义了4个流,它们是 cin 、 cout 、 cerr 和 clog 。
(4)使用文件流类库的程序必须用# include编译指令将头文件 fstream.h 包含进来。
(5)C++的I/O流类库提供了2种控制格式输人输出的方法。一种是用 ios类的成员函数 ,另一种是 使用控制符 。
(6)按数据的存取方式来分类,文件可分为 顺序文件 和 随机读写文件 。
(7)C++中共有3种文件流,它们是 输入文件流 、 输出文件流 和 输入/输出文件流 。
(8)打开文件就是使一个文件流对象与 一个指定的文件 相关联。
(9)如果打于文件失败,则流对象的值为 0 。
(10)最好用istream的函数 read 和ostream 的函数 write 分别来读/写二进制文件。
二、选择题(至少选一个,可以多选)
(1)进行文件输人操作时应包含( B )文件。A. ifstream.h B. fstream.h C. ofstream.h D.iostream. h
(2)下列类中( A )不是输人输出流类iostream的基类。
A. fstream B. istream C. ostream D.ios
(3)在下列选项中( B C D )是ostream类的对象。
A. cin B. cerr C. clog D. cout
(4)使用控制符进行格式输出时,应包含( C )文件。A. iostream. h B. math. h
C. iomanip. h D. fstream. h
(5)在ios类提供的控制格式标志字中,( A )是转换为十六进制形式的标志常量。A. hex B. oct C. dec D. right
(6)下列选项中,用于清除基数格式位设置以八进制输出的语句是( C )。A. cout< <setf(ios:.dec ,ios:basefield);
B. cout< <setf(ios::hex,iosbasefield);
C. cout< < setf(iosl.octios..; basefield);
(7)函数stais:dusifiled中a的值可以是( A B )
A. ios::left B. ios::right C. ios::hec D. ios::oct
(8) 下列格式控制符,在iostream. h中定义的是( A D ),在iomanip.b中定义的是( B C )。
A. endl B. setfill C. setw D. oct
(9)控制输出格式的控制符中,( D )是设置输出宽度的。
A. ws B. ends C. sefill() D. setw()
(10)下列输出字符'A'的方法中,( B )是错误的。
(11)关于对getline()函数的下列描述中,( A )是错误的。
A.该函数所使用的终止符只能是换行符
B.该函数是从键盘上读取字符审的
C.该函数所读取的字符串的长度是受限制的
D. 该函数读取字符审时遇到终止符便停止
(12) 下面( B C )语句能把"Hello,students"赋值给一个字符数组string[50].
C. cin, get(string,40,'\n'); D. cin. get(string);
(13)关于read()函数的下列描述中,( C )是正确的。
D.从输人流中读取一行字符
(14)在打开磁盘文件的访问方式常量中,( C )是以追加方式打开文件的。
A. in B. out C. app D. ate
(15)下面( B C D )语句以写的方式打开文件“myfile. dat”。
A. ifstream infile( "myfile. dat" ,ios:in);
B. fstream infile("myfile. dat" ,ios::app);
C. fstream infile( "myfile. dat" ,ios::out);
D. ofstream infile( "myfile. dat");
(16)假定已定义整型变量data,以二进制方式把data的值写人输出文件流对象outile中去,正确的语句是( C )
A. outfile. write((int* )&data ,sizeof(int));
B. outfile. write((int* )&data,data);
C. outfile. write( (char* )&data ,sizeof(int));
D. outfile, write((char* )&data,data);上iesd
三、判断题
(1)流格式标志字的每位表示一种格式,格式位之间互不影响。 (错)
(2)控制符本身是一一种对象,它可以直接被提取符或插人符操作。 (对)
(3)预定义的提取符和插人符都是可以重载的。 (对)
(4)函数write()是用来将一个字符串送到一种输出流中,但必须将一个字符串中全部字符都送到输出流中。 (错)
(5)以app方式打开文件时,当前指针定位于文件尾。 (对)
(6) read()函数只能用于文本文件的操作中。 (错)
四、简答题
(1)分析说明C++语言的流类库中为什么要将ios类作为其派生类的虚基类。
答: 从流类库的基本结构可以看到,ios类是istream 类和ostream 类的基类,从ios头公有派生 istream 和ostream两个类, 而iostream 类通过多重继承istream 类和ostream类而产生的。如果不将ios类作为其派生类的虚基类,可能会产生二义性:
(2)文本文件与二进制文件有什么区别?并说明在什么情况下应该使用文本文件?在 什么情况下使用二进制文件。
答: 在文术文件中,每个字节存放一 个ASCII 代码表示一个字符,文本文件的优点是可直接按字符形式输出,供人们阅读。二进制 文件则是把数据的内部存储形式原样作放到文件中。这种文件的优点是与数据在内存中的存储形式保持一致,因此存储效率高,无须进行存储形式的转换,但不能直接按字符形式输出。对于那些保存中间运算结果的临时工作文件,使用二进制形式较为合理。
五、程序分析题(写出程序的输出结果并分析输出结果)
#include<bits/stdc++.h>
#include<iostream>
#include<fstream>
using namespace std;
int main()
{
char buf[80];
ofstream outfile;
outfile.open("data.txt");
if(!outfile)
{
cout<<"can't open the file"<<endl;
exit(1);
}
outfile<<"hello,students!"<<endl;
outfile<<"welcome you to oop!"<<endl;
outfile.close();
ifstream infile;
infile.open("data.txt");
if(!infile)
{
cout<<"can't open the file"<<endl;
exit(1);
}
while (!infile.eof())
{
infile.getline(buf,80);
cout<<buf<<endl;
}
infile.close();
return 0;
}
运行结果如下:
六、程序设计题
(1)定义一个分数类fraction,通过重载的运算符“<<”以分数形式输出分数的结果, 如将三分之二输出为2/3。
(2)按一行一行的方法将一个文本文件复制到另一个文件中。
(3)编写一个程序来统计文件 file. txt 的字符个数。