C++中istream的使用
在項目中會經常用到讀取一些配置數據,這些數據根據實際需要有可能會調整,如果將這些數據直接嵌入進代碼中會非常不便,需要經常調整代碼。將這些數據寫入配置文件中然后在讀入,如果需要調整,只需修改配置文件,code不用作任何改動,這樣會非常方便。最常用到的讀取配置文件的方式是使用istream類。
std::istream: input stream. Input stream objects can read and interpret input from sequences of characters. The standard object cin?is an object of this type.
標準中定義的std::cin就是istream類型。istream是std::basic_istream類模板的一個實例化。
c++中定義的標準輸入輸出流是istream和ostream,他們是iostream類的父類,而cin是istream的對象,cout是ostream的對象。頭文件fstream(對文件操作的流)包含了ifstream和ofstream,頭文件sstream(對字符串操作的流)包含了istringstream和ostringstream,這些類都是繼承自istream和ostream的。它們的關系如下圖:
有兩種情況會使一個istream對象的bool轉型為false:讀到EOF(文件結束標志)或遇到一個無效的值(輸入流進入fail狀態)。istream對象的bool轉型為false的情況下,此后的所有讀入動作都是無操作。直到調用istream對象的成員函數clear()來清除該對象的內部狀態。
缺省情況下,輸入操作符丟棄空白符、空格符、制表符、換行符以及回車。如果希望讀入上述字符,或讀入原始的輸入數據,一種方法是使用istream的get()成員函數來讀取一個字符,另一種方法是使用istream的getline()成員函數來讀取多個字符。istream的read(char* addr, streamsize size)函數從輸入流中提取size個連續的字節,并將其放在地址從addr開始的內存中。istream成員函數gcount()返回由最后的get()、getline()、read()調用實際提取的字符數。read()一般多用在讀取二進制文件,讀取塊數據。
輸入流有三個函數來測試流狀態:即bad(),fail()和eof()。ignore()用來拋掉指定個數的緩沖區中的字節。如果bad()為真,代表是遇到了系統級的故障。如果fail()為真,則表示輸入了非法的字符。
其它的istream成員函數:putback( char c ) 將字符放回iostream;unget()往回重置”下一個”istream項;peek()返回下一個字符或EOF,但不要提取出來。
以下是測試代碼:
#include <iostream>
#include <fstream>
#include <string>
#include "istream.hpp"void test_istream()
{//std::istringstreamstd::filebuf in;if (!in.open("E:/GitCode/Messy_Test/testdata/istream.data", std::ios::in)) {std::cout << "fail to open file" << std::endl;return;}std::istream iss(&in);std::string str;int count = 0;while (!iss.eof()) {if (iss.bad()) {std::cout << "input stream corrupted" << std::endl;break;}if (iss.fail()) {std::cout << "bad data" << std::endl;iss.clear(std::istream::failbit);iss.ignore(256, '\n');continue;}std::getline(iss, str);if (str == "#filename:") {iss >> str;std::cout << "file name: " << str << std::endl;}if (str == "#content:") {std::getline(iss, str);std::cout << "file content: " << str << std::endl;}if (str == "#add operation:") {int a, b;iss >> a >> b;std::cout << "a + b = " << (a + b) << std::endl;}if (str == "#char array:") {char a, b, c, d, e, f;iss >> a >> b >> c >> d >> e >> f;std::cout << a << " " << b << " " << c << " " << d << " " << e << " " << f << std::endl;}if (str == "#int array:") {int arr[2][3];for (int i = 0; i < 2; i++) {for (int j = 0; j < 3; j++) {iss >> arr[i][j];}}for (int i = 0; i < 2; i++) {for (int j = 0; j < 3; j++) {std::cout << arr[i][j] << " ";}std::cout << std::endl;}}if (str == "#mean value:") {float mean_value;iss >> mean_value;std::cout << "mean_value = " << mean_value << std::endl;}}in.close();
}
執行結果如下圖:
主要參考文獻:
1.?http://www.cplusplus.com/reference/istream/istream/
2.?http://www.zaojiahua.com/inputoutput-stream.html?
GitHub:https://github.com/fengbingchun/Messy_Test
?
總結
以上是生活随笔為你收集整理的C++中istream的使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++中static_cast/cons
- 下一篇: C++中模板的使用