C++的流输入和输出操作
1、簡單提示輸入和輸出
2、為格式化提供操作符和標志
3、輸入和輸出對象類型
4、解析輸入例子(日期確認)
?
1、簡單提示輸入和輸出
最常用的程序結合輸入和輸出來溝通,從他們信息(輸入)中為用戶呈現有用的信息(輸出)。無論什么程序一旦離開輸入或者輸出功能就是沒有用的!?
?
命令行的輸入和輸出是一個程序與用戶之間的互動。雖然命令行界面是如此的單調,但至少可以說,這是最基本和最快捷的執行。
?
一個C++程序可以執行輸入和輸出有好幾種方式,最常見的是通過使用流。“流”這個詞語的直覺是一個程序“看”只有輸入或輸出,而不是起源(源)或數據的目的地。一個常見的比喻,當水從你的腳邊流過,你看見你腳下的水卻不知道這水從哪里來又要流到哪里去。
?
一個輸出例子。
#include <iostream>
?
namespace std;
using namespace std;
?
int main(){
cout << "Hello,world.\n"; // The simple "Hello World" example.
return 0;
}
?
用cout和插入操作符(“<<”)應該始終顯示在屏幕終端。
?
輸入就像輸出一樣使用cin和提取操作(“>>”)。cin是最好想法的語法用來獲取從鍵盤輸入。盡管使用cin靠近提取操作時所有空白被忽略和跳過。使用復合的提取操作來處理字符串,可能會產生不可預期的運行時效果-通常被稱為緩沖區問題-適當的對于用戶的不可預測性和他們古怪的輸入。
?
提取操作是最保守的用來數字輸入或者用來可預測性的格式輸入-通常來自一個準備好的文件。
?
cout派生自ostream類和cin是派生自istrem類。繼承是很有用處的,等下介紹。
?
獲取用戶最安全的方式是使用重載成員函數get()通常很多程序員都這么做。
?
#include <iostream>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
?char unit;
?bool boolExit = true;
?do
?{
??cout << "Enter Compass Direction.";
??cin.get(unit);? // Get a single character.
??while('\n' != cin.get()); // Clear Buffer.
??switch(unit)
??{
??case 'n':
??case 'N':
???cout << "North.";
???break;
??case 's':
??case 'S':
???cout << "South.";
???break;
??case 'e':
??case 'E':
???cout <<"East.";
???break;
??case 'w':
??case 'W':
???cout <<"West.";
???break;
??default:
???cout << "Check Your Compass.\n";
???boolExit = false;
???break;
??}
?} while ( !boolExit);
?
?return 0;
}
?
前面這個例子的程序請求用戶輸入,程序預期一個單獨的字符。然而用戶不會注意到這個單獨字符的條件,因此程序員的職責需要預料和處理所有可能的輸入-包括“愚蠢”的輸入。
?
例子中,只有用戶在輸入第一個字符來試著存儲和驗證。所有其他后面的字符串會被這一行“吃掉”:while( '\n' == cin.get() );這會避免緩沖區問題和停止do..while loop 重復的一遍又一遍的同時從一個長的字符串獲取各個字符和阻止轉儲“Check Your Compass”。大家都清楚沒有清除緩沖會遇到不良運行時效果。使用流時出現緩沖錯誤是很常見的。記住要要永遠清除緩沖!
程序要能處理用戶輸入不同長度的字符和有效率的方式存儲輸入在內存中。通過使用指針可以達到這個目的。
記住指針是一個保存一段運行時在堆上分配預留內存的首地址。一個指針可以“指向”所有類型的變量。一個指針甚至可以指向另外一個指針。
#include <iostream>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
?char buffer[101], * said;
?cout << "Enter:";
?cin.get(buffer, 101, '\n');
?while('\n' != cin.get());
?said = new char[strlen(buffer)+1];
?strcpy(said, buffer);
?cout << "Echo:" << said;
?delete []said;
?
?system("pause");
?return 0;
}
?前面這個例子第一申明了一個正常的cstring, 有充足的緩沖。第二,一個新的動態的cstring的大小是由通過strlen()函數取得緩沖的大小再增加1用來存放null終止符。顯然這樣可以節省內存,如果要存儲有多個cstring,而不是分配相同的固定長度為每個cstring的。
由于輸出可能要被“分流”到不同的目的地,比如,給的低劣的屏幕或文本文件,繼承的使用。
#include <iostream>
#include <fstream>
using namespace std;
void stream2(ostream& os, char *);
int _tmain(int argc, _TCHAR* argv[])
{
?stream2(cout, "Hello World.\n");
?char *say = "And Hello again.\n";
?stream2(cout, say);
?ofstream outFile;
?outFile.open("sample.txt");
?stream2(outFile, say);
?outFile.close();
?return 0;
}
void stream2(ostream& os, char *say)
{
?os << say;
?return;
}
前面這個例子,ostream類是作為函數stream2()的一個參數。這是因為繼承允許許多輸入流通過函數體,包括ofstream類型的文件流和ostream類型的標準cout。
也有一些與char say[] = "Whatever"很相似;而不是char *say="Whatever";。大多數人會說這兩個代碼片段沒什么不同。那么,這兩者之間是否有所不同呢?當然有。使用數組在靜態內存塊標記了9個字節的存儲,8個字符加上一個NULL字符。然而,指針同樣標記了需要的9個字節,另外有兩個字節來保存引用char2say的指針變量。
繼承是C++一個強大的特征,用來派生類。簡單地說,一個派生類使用一個現有的類,但是添加了獨特的功能(額外的特征)類形成一個新的類。比如,cout和ofstream同樣都派生自ostream類-ofstream類增加額外的成員函數像open()和close()。cin和ifstream同樣派生自istream類。
需要注意的是一個流可以成為一個函數的參數,唯一的限制是這個函數的形參必須傳引用而不是傳值。
一些有用的流控制函數的概況:
istream::get() 從istrem獲取和返回一個字符-包含空白字符。
istream::get(char&) 從istream獲取一個字符并且存儲到參數別名的引用。也包含空白字符。
istream::get(char*, int ,char) 從istream處不斷獲取字符直到整數限制-1到達,找到分界字符,或者到達流的末尾。獲取的字符存儲到給定的由null終結的cstring。如果分界符找到了,那么它不提取也不存放。這個也包含空白字符。
ostream::put(char) 放一個單獨發字符到ostream中。
istream::putback(char) 將一個字符放回到istream。這個字符必須是剛剛提取的,否則其結果未定義。
轉載于:https://www.cnblogs.com/qqting/archive/2010/08/16/1800839.html
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的C++的流输入和输出操作的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux——线程通信(1)
- 下一篇: C++学习——C++中的四个智能指针