C++学习45 流成员函数put输出单个字符 cin输入流详解 get()函数读入一个字符
在程序中一般用cout和插入運算符“<<”實現輸出,cout流在內存中有相應的緩沖區。有時用戶還有特殊的輸出要求,例如只輸出一個字符。ostream類除了提供上面介紹過的用于格式控制的成員函數外,還提供了專用于輸出單個字符的成員函數put。如:
? ? cout.put('a');
調用該函數的結果是在屏幕上顯示一個字符a。put函數的參數可以是字符或字符的ASCII代碼(也可以是一個整型表達式)。如
? ? cout.put(65 + 32);
也顯示字符a,因為97是字符a的ASCII代碼。
可以在一個語句中連續調用put函數。如:
? ? cout.put(71).put(79).put(79). put(68).put('\n');
在屏幕上顯示GOOD。
[例13.4] 有一個字符串"BASIC",要求把它們按相反的順序輸出。
#include <iostream> using namespace std; int main( ) {char *a="BASIC";//字符指針指向'B'for(int i=4;i>=0;i--)cout.put(*(a+i)); //從最后一個字符開始輸出cout.put('\n');return 0; }除了使用cout.put函數輸出一個字符外,還可以用putchar函數輸出一個字符。putchar函數是C語言中使用的,在stdio.h頭文件中定義。C++保留了這個函數,在iostream頭文件中定義。
[例13.4] 也可以改用putchar函數實現。
#include <iostream> //也可以用#include <stdio.h>,同時不要下一行 using namespace std; int main( ) {char *a="BASIC";for(int i=4;i>=0;i--)putchar(*(a+i));putchar('\n'); }成員函數put不僅可以用cout流對象來調用,而且也可以用ostream類的其他流對象調用。
?
?cin輸入流詳解
標準輸入流是從標準輸入設備(鍵盤)流向程序的數據。在頭文件iostream.h中定義了cin、cout、cerr、clog 4個流對象(詳情請查看:與C++輸入輸出有關的類和對象),cin是輸入流,cout、cerr、clog是輸出流。
cin是istream類的對象,它從標準輸入設備(鍵盤)獲取數據,程序中的變量通過流提取符“>>”從流中提取數據。流提取符“>>”從流中提取數據時通常跳過輸入流中的空格、tab鍵、換行符等空白字符。
注意:只有在輸入完數據再按回車鍵后,該行數據才被送入鍵盤緩沖區,形成輸入流,提取運算符“>>”才能從中提取數據。需要注意保證從流中讀取數據能正常進行。
例如:
? ? int a,b;
? ? cin>>a>>b;
若從鍵盤上輸入
? ? 21 ?abc↙
變量a從輸入流中提取整數21,提取操作成功,此時cin流處于正常狀態。但在變量b準備提取一個整數時,遇到了字母a,顯然提取操作失敗了,此時,cin流被置為出錯狀態。只有在正常狀態時,才能從輸入流中提取數據。
當遇到無效字符或遇到文件結束符(不是換行符,是文件中的數據已讀完)時,輸入流cin就處于出錯狀態,即無法正常提取數據。此時對cin流的所有提取操作將終止。在 IBM PC及其兼容機中,以Ctrl + Z表示文件結束符。在UNIX和Macintosh系統中,以 Ctrl + D表示文件結束符。當輸入流cin處于出錯狀態時,如果測試cin的值,可以發現它的值為false(假),即cin為0值。如果輸入流在正常狀態,cin的值為true(真),即cin為 一個非0值??梢酝ㄟ^測試cin的值,判斷流對象是否處于正常狀態和提取操作是否成功。如:
? ? if(!cn) //流cin處于出銷狀態,無法正常提取數據
? ? ? ? cout<<"error";
[例13.5] 通過測試cin的真值,判斷流對象是否處于正常狀態。
#include <iostream> using namespace std; int main( ) {float grade;cout<<"enter grade:";while(cin>>grade)//能從cin流讀取數據 {if(grade>=85) cout<<grade<<"GOOD!"<<endl;if(grade<60) cout<<grade<<"fail!"<<endl;cout<<"enter grade:";}cout<<"The end."<<endl;return 0; }流提取符“>>”不斷地從流中提取數據(每次提取一個浮點數),如果成功,就陚給 grade,此時cin為真,若不成功則cin為假。如果鍵入文件結束符,表示數據已完。
運行情況如下:
enter grade: 67↙
enter grade: 89↙
89 GOOD!
enter grade: 56↙
56 fail!
enter grade: 100↙
100 GOOD!
enter grade: ^Z↙//鍵入文件結束符
The end.
在遇到文件結束符時,程序結束。如果某次輸入的數據為
? ? enter grade: 100/2↙
流提取符">>"提取100,賦給grade,進行if語句的處理。然后再遇到"/",認為是無效字符,cin返回0。循環結束,輸出"The end."。
在不同的C++系統下運行此程序,在最后的處理上有些不同。以上是在GCC環境下運行程序的結果,如果在VC++環境(筆者使用win7系統)下運行此程序,在鍵入Ctrl + Z 時,需要敲擊兩次回車,程序才輸出"The end."。
get()函數讀入一個字符
get()函數是cin輸入流對象的成員函數,它有3種形式:無參數的,有一個參數的,有3個參數的。
1) 不帶參數的get函數
其調用形式為
? ? cin.get()
用來從指定的輸入流中提取一個字符(包括空白字符),函數的返回值就是讀入的字符。 若遇到輸入流中的文件結束符,則函數值返回文件結束標志EOF(End Of File),一般以-1代表EOF,用-1而不用0或正值,是考慮到不與字符的ASCII代碼混淆,但不同的C ++系統所用的EOF值有可能不同。
[例13.6] 用get函數讀入字符。
#include <iostream> using namespace std; int main( ) {int c;cout<<"enter a sentence:"<<endl;while((c=cin.get())!=EOF)cout.put(c);return 0; }運行情況如下:
enter a sentence:
I study C++ very hard.↙(輸入一行字符)
I study C++ very hard.????????????? (輸出該行字符)
^Z↙(程序結束)
C語言中的getchar函數與流成員函數cin.get( )的功能相同,C++保留了C的這種用法,可以用getchar(c)從鍵盤讀入一個字符賦給c。
2) 有一個參數的get函數
其調用形式為
? ? cin.get(ch)
其作用是從輸入流中讀取一個字符,賦給字符變量ch。如果讀取成功則函數返回true(真),如失敗(遇文件結束符) 則函數返回false(假)。例13.6可以改寫如下:
3) 有3個參數的get函數
其調用形式為
? ? cin.get(字符數組, 字符個數n, 終止字符)
或
? ? cin.get(字符指針, 字符個數n, 終止字符)
其作用是從輸入流中讀取n-1個字符,賦給指定的字符數組(或字符指針指向的數組),如果在讀取n-1個字符之前遇到指定的終止字符,則提前結束讀取。如果讀取成功則函數返回true(真),如失敗(遇文件結束符) 則函數返回false(假)。再將例13.6改寫如下:
運行情況如下:
enter a sentence:
I study C++ very hard.↙
I study
在輸入流中有22個字符,但由于在get函數中指定的n為10,讀取n -1個(即9個)字符并賦給字符數組ch中前9個元素。有人可能要問:指定n-10,為什么只讀取9個字符呢?因為存放的是一個字符串,因此在9個字符之后要加入一個字符串結束標志,實際上存放到數組中的是10個字符。請讀者思考:如果不加入字符串結束標志,會 出現什么情況?結果是:在用“cout<<ch”;輸出數組中的字符時,不是輸出讀入的字符串,而是數組中的全部元素。大家可以親自測試一下ch[9](即數組中第10個元素)的值是什么。
如果輸入↙
? ? abcde
即未讀完第9個字符就遇到終止字符、讀取操作終止,前5個字符已存放到數組ch[0]到ch[4]中,ch[5]中存放'\0'。
如果在get函數中指定的n為20,而輸入22個字符,則將輸入流中前19個字符賦給字符數組ch中前19個元素,再加入一個'\0'。
get函數中第3個參數可以省寫,此時默認為'\n'。下面兩行等價:
? ? cin.get(ch,10,'\\n');
? ? cin.get(ch,10);
終止字符也可以用其他字符。如
? ? cin.get(ch,10,'x');
在遇到字符'x'時停止讀取操作。
轉載于:https://www.cnblogs.com/Caden-liu8888/p/5839277.html
總結
以上是生活随笔為你收集整理的C++学习45 流成员函数put输出单个字符 cin输入流详解 get()函数读入一个字符的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: html中不写form的后果,html之
- 下一篇: 正确使用自旋锁、互斥锁