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