程序的输入指的是文件将数据传送给程序,程序的输出指的是从程序将数据传送输出文件。
C++的输入和和输出包括以下三个方面:
- 对系统指定的标准设备的输入和输出,即从键盘输入数据,输出到显示器屏幕。
- 以外存磁盘(或光盘、移动存储)文件为对象进行输入和输出,例如从磁盘文件输入数据,数据输出到磁盘文件。
- 对内存中指定的空间进行输入和输出,通常指定一个字符数组作为存储空间(实际上可以利用空间存储任何信息)。
这种输入输出称为标准输入输出,简称标准I/O。为了实现数据的有效流动,C++系统提供了庞大的I/O类库,调用不同的类去实现不同的功能。
输入和输出是数据传送的过程,数据如流水一样从一处流向另一处。C++形象地将此过程称为流(stream)。C++的输入输出流是指由若干字节组成的字节序列,这些字节中的数据按顺序从一个对象传送到另一对象。流表示了信息从源到目的端的流动。
在C++中,输入输出流被定义为类,C++的I/O库中的类称为流类(stream class),用流类定义的对象称为流对象。在之前案例中使用到的cout和cin则是iostream类的对象。
一、iostream类库中有关的类
C++编译系统提供了用于输入输出的iostream类库,iostream这个单词是由3个部分组成的,即i-o-stream,意为输入输出流。在iostream类库中包含许多用于输入输出的类。
常用如下表:
类名 | 作用 | 在哪个头文件中声明 |
---|---|---|
ios | 抽象类 | iostream |
istream ostream iostream | 通用输入流和其他输入流的基类 通用输出流和其他输出流的基类 通用输入输出流和其他输入输出流的基类 | iostream iostream iostream |
ifstream ofstream fstream | 输入文件流类 输出文件流类 输入输出文件流类 | fstream fstream fstream |
istrstream ostrstream strstream | 输入字符串流类 输出字符串流类 输入输出字符串流类 | strstream strstream strstream |
ios是抽象基类,由它派生出istream类和ostream类,两个类名第一个字母i和o分别代表输入(input)和输出(output)。istream类支持输入操作,ostream类支持输出操作,iostream类支持输入输出操作。iostream类是从istream类和ostream类通过多重继承而派生的类。
C++对文件的输入输出需要用ifstream和ofstream类,两个类中第一个字母i和o分别代表输入和输出,第二个字母f代表文件(file)。ifstream支持对文件的输入操作,ostream支持对文件的输出操作。ifstream类继承了istream类,ofstream类继承了ostream类,fstream类继承了iostream类。
1.1 示例istream和ostream
从控制台读取输入并输出信息,代码如下:
#include <iostream>
#include <string>
int main(){
std::string input; //定义变量input
std::cout <<"Please enter your name: "; // 使用ostream的cout对象
std::cin >>input; // 使用istream的cin对象
std::cout <<"You name is: " <<input <<std::endl;
return 0;
}
运行结果如下图:
1.2 示例iostream和fstream
读取本地.txt文件和写入.txt文件中,首先我们在案例代码文件的当前目录,创建一个input.txt文件,并写下如下内容:
Hello World!
This is an example of copying the file input.txt to output.txt.
再创建一个空文件output.txt文件。
将input.txt中内容复制到output.txt文件中代码如下:
#include <fstream>
#include <iostream>
#include <string>
int main(){
// 创建一个ifstream对象来读取文件
std::ifstream inputfile("input.txt");
// 创建一个ofstream对象来写入文件
std::ofstream outputfile("output.txt");
//判断读取文件是否存在
if(!inputfile){
std::cerr <<"Unable to open input file" <<std::endl;
return 1;
}
// 判断输出文件是否存在
if(!outputfile){
std::cerr <<"Unable to open output file" <<std::endl;
return 1;
}
// 开始复制input.txt中内容到output..txt文件中
std::string line;
while(std::getline(inputfile, line)){ // 从输入文件读取每一行
outputfile <<line <<std::endl; // 将读取的行写入输出文件
}
// 操作完成后需要关闭输入和输出流
inputfile.close(); //关闭输入文件
outputfile.close(); //关闭输出文件
// 显示输出结果
std::cout <<"File copy complete." <<std::endl;
return 0;
}
系统编译后并运行,得到结果如下图:
此时再打开output.txt,则input.txt中内容已复制过来,如下图:
二、与iostream类库有关的头文件
iostream类库中不同的类的声明被放在不同的头文件中,用户在自己的程序中用#include命令包含了有关的头文件就相当于在本程序中声明了所需要用到的类。
头文件是程序与类库的接口,iostream类库的接口分别由不同的头文件来实现。常用的有:
iostream:包含了输入输出流进行操作所需的基本信息。
fstream:用于用户管理的文件的I/O操作。
strstream:用于字符串流I/O。
stdiostream:用于混合使用C和C++的I/O机制时,例如想将C程序转变为C++程序。
iomanip:在使用格式化I/O时应包含此文件。
iomanip库用于控制输出的格式,例如输出精度、设置字段宽度等。如下面sdt::fixed和std:setprecision来控制浮点数的输出格式,使用std::setw来设置字段宽度。
示例代码如下:
#include <iostream>
#include <iomanip>
int main(){
// 定义PI
double PI = 3.14159265358979323846;
// 直接输出PI变量
std::cout <<"Output variable: PI = " <<PI <<std::endl;
// 设置输出精度和宽度
std::cout <<"Set output precision and then output variables:" <<std::endl;
std::cout <<"PI = " <<std::fixed <<std::setprecision(2) <<PI <<std::endl;
std::cout <<std::endl;
// 输出整数和浮点数,并使用setw设置字段宽度
int x = 123;
double y = 456.789;
std::cout <<"Set output width and then output variables:" <<std::endl;
std::cout <<std::setw(5) <<x <<std::endl;
std::cout <<std::setw(10) <<y <<std::endl;
return 0;
}
输出结果如下图:
三、在iostream头文件中定义的流对象
在iostream头文件中定义的类有ios、istream、ostream、istream_withassign、ostream_withassign、iostream_withassign等。
iostream包含了对输入输出流进行操作所需的基本信息,因此大多数C++程序都包括iostream,在iostream头文件中不仅定义了有关的类,还定义了4种流对象,如下表:
对象 | 含义 | 对应设备 | 对应的类 | C语言中相应的标准文件 |
---|---|---|---|---|
cin | 标准输入流 | 键盘 | istream_withassign | stdin |
cout | 标准输出流 | 屏幕 | ostream_withassign | stdout |
cerr | 标准错误流 | 屏幕 | ostream_withassign | stderr |
clog | 标准错误流 | 屏幕 | ostream_withassign | stderr |
cin是istream的派生类istream_withassign的对象,它是从标准输入设备(键盘)输入到内存的数据流,称为cin流或标准输入流。
cout是ostream的派生类ostream_withassign的对象,它是从内存输入到标准输出设置(显示器)的数据流,称为cout或标准输出流。
cerr和clog作用相似,均为输出设置(显示器)输出出错信息,所以向显示器输出错误信息时用cerr或clog流。
四、在iostream头文件中重载运算符
”<<“和”>>“在C++中本来是被定义为左位移运算符和右位移运算符的,由于iostream头文件中对它们进行了重载,使它们能用作标准类型数据的输入和输出运算符。在使用它们前,必须在程序中用#include命令把iostream包含到程序中。代码如下:
#include <iostream>
至所以可cout和cin可以使用”<<“和”>>“对标准数据类型进行输出和输入,是在istream和ostream类中分别有一组成员函数对位移运算符进行重载,以便能用它输入或输出各种标准数据类型的数据。示例如下:
ostream operator << (int); // 用于向输出流插入一个int数据
ostream operator << (float); // 用于向输出流插入一个float数据
ostream operator << (char); // 用于向输出流插入一个char数据
ostream operator << (char *); // 用于向输出流插入一个字符串数据
在istream类中已将运算符”>>“重载为以下标准类型的提取运算符:char、signed char、unsigned char、short、unsigned short、int 、unsigned int、long、unsigned long、float、double、long double、char *、signed char *、unsigned char*等。
在ostream类中将”<<“重载为插入运算符,其适用类型除了以上标准类型外,还增加了一个void *类型。
如果想将”<<“和”>>“用于自己声明的类型的数据,除了需要包含头文件iostream外,还必须对”<<“和”>>“进行重载。具体如何重载这里就不细讲了,之前已有篇幅讲述过运算符重载相关内容,须了解的朋友可以翻看前面讲的内容,地址:C++面向对象程序设计 - 运算符重载_运算符重载 小花在上《面向对象程序设计》这门课之前,一直认为“+”法只能实现1+2-CSDN博客