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可以改寫如下:

#include <iostream>
using namespace std;
int main( )
{
   char c;
   cout<<"enter a sentence:"<<endl;
   while(cin.get(c))  //讀取一個字符賦給字符變量c,如果讀取成功,cin.get(c)為真
   {cout.put(c);}
   cout<<"end"<<endl;
   return 0;
}

3) 有3個參數的get函數
其調用形式為
    cin.get(字符數組, 字符個數n, 終止字符)

    cin.get(字符指針, 字符個數n, 終止字符)
其作用是從輸入流中讀取n-1個字符,賦給指定的字符數組(或字符指針指向的數組),如果在讀取n-1個字符之前遇到指定的終止字符,則提前結束讀取。如果讀取成功則函數返回true(真),如失敗(遇文件結束符) 則函數返回false(假)。再將例13.6改寫如下:

#include <iostream>
using namespace std;
int main( )
{
   char ch[20];
   cout<<"enter a sentence:"<<endl;
   cin.get(ch,10,'\\n');//指定換行符為終止字符
  cout<<ch<<endl;
   return 0;
}

運行情況如下:
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'時停止讀取操作。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM