? ? ? ? 程序的輸入指的是文件將數據傳送給程序,程序的輸出指的是從程序將數據傳送輸出文件。
? ? ? ? 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; //定義變量inputstd::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(){// 定義PIdouble 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博客
????????