10.c/c++程序员面试宝典-输入流与输出流

2021-12-03
4

10.c/c++程序员面试宝典-输入流与输出流

标准库的输入输出功能就涉及了流的使用。c++的输入输出流是指由若干字节组成的字节序列,这些字节中的数据按顺序从一个对象传送到另一个对象。刘实际上是程序中输入或输出设备的一种抽象表示,它表示了信息从源端到目的端的运动。在输入操作时,字节流从输入设备(如键盘、磁盘)流向内存;在输出操作时,字节流从内存流向输出设备(例如屏幕、打印机、磁盘等)。流中的内容可以是ASCII字符、二进制形式的数据、图像图形、、数字音频视频或其他形式的信息。


实际上,在内存中为每个数据流开辟一个内存缓冲区,是用来存放流中的数据。流是与内存缓冲区相对应的。或者可以说,缓冲区中的数据就是流。



面试题69  什么是标准输入输出流***


分析:在c++语言中,数据的输入和输出(简写为I/O)包括对标准输入设备键盘和标准输出设备显示器、对在外存磁盘上的文件和对内存中指定的字符串存储空间进行输入输出这3个方面。对标准输入设备和标准输出设备的输入输出简称为标准I/O,对在外存磁盘上文件的输入输出简称为文件I/O,对内存中指定的字符串存储空间的输入输出简称为串I/O。


c++语言系统为实现数据的输入和输出定义了一个庞大的类库,它包括的类主要有ios、istream、ostream、iostream、ifstream、ofstream、fstream、istrstream、ostrstream、strstream等,其中ios为根基类,其余都是它的直接或间接派生类。ios为根基类,它直接派生4个类,分别是输入流类istream、输出流类ostream、文件流基类fstreambase和字符串流基类strstreambase。输入文件流类同时继承了输入流类和文件流基类(当然对于根基类是间接继承),输出文件流类oftream同时继承了输出流类和文件流基类,输入字符串流类istrstream同时继承了输入流类和字符串流基类,输出字符串流类ostrstream同时继承了输出流类和字符串流基类,输入输出流类iostream同时继承了输入流类和输出流类,输入输出文件流类fstream同时继承了输入输出流类和文件流基类,输入输出字符串流类strstream同时继承了输入输出流类和字符串流基类。


c++编译系统提供了用于输入输出的iostream类库。iostream这个单词是由3个部分组成的:i-o-stream,即输入输出流。在iostream类库中包含许多用于输入输出的类。iostream类库中不同的类的声明被放在不同的头文件中,用户在自己的程序中使用#include命令包含了有关的头文件就相当于在本程序中声明了所需要用到的类。可以换一种说法是:头文件是程序与类库的接口,iostream类库的接口分别由不同的头文件来实现。


【答案】标准输入流是从标准输入设备(键盘)流向程序的数据。标准输出流是流向标准输出设备(显示器)的数据。




面试题70 如何重载输入输出**


分析:重载是面向对象编程的重要概念,重载可以减少代码量,是代码简洁,重载就是基于不同的参数表让同一个名称的函数定义不同的函数。


一个重载输入输出的代码示例如下:

#include<string>

#include<iostream>

class Fruit

{

string name;     //定义一个name成员

string colour;   //定义一个colour成员

public:

friend istream& operator>>(istream&, Fruit&);

friend ostream& operator<<(ostream&, const Fruit&);

void print()  //定义一个输出名字的成员print()

{

cout<<colour<<" "<<name<<endl; 

}

Fruit(const string &nst="apple", const string &cst="green"):name(nst),colour(cst) //构造函数

{

}

~Fruit()  //析构函数

{

}

};

ostream& operator<<(ostream &out,const Fruit &s)  //输出操作符的重载

{

out<<s.colour<<" "<<s.name;

return out;

}

istream& operator>>(istream& in,Fruit &s)  //输入操作符的重载

{

in>>s.colour>>s.name;

if(!in)

cerr<<"wrong input!"<<endl;

return in;

}

int main()

{

Fruit apple;

cin>>apple;

cout<<apple;

return 0;

}


【答案】重载在相同范围中为一个给定函数名称提供了多种定义。委托编译器依据调用该函数的参量选择合适的函数或运算符的版本。重载可以为输入输出提供更加简洁的代码。


评论