C++IO關於cin>>和getline的理解


這個問題困擾了我有一段時間了,趁着十一放假有時間,仔細研究了一下

首先來看一下輸入輸出運算符cin>>的構成:cin和>>

cin>>是由兩部分構成的,cin和>>,其中cin是輸入流istream類的一個對象,隸屬於iostream函數庫

而>>則是運算符:這個運算符的作用是:從左側cin對象中讀取數據,並將它賦給右側的運算對象

    大體的大概說完了,接下來就是干貨了!!

....................................................

cin>>這個表達式應該分為兩部分來看:cin 和>>

其中cin僅僅是一個istream對象!!!它的值反映的是當前輸入流的狀態:即cin對象接下來能否進行輸入操作(能否從cin對象中讀取數據)

cin對象實際上面向兩方面的功能:

    1.外部設備與cin之間:這部分對於程序員來說是透明的

      設備(鍵盤)對它的修改,即通過設備直接修改cin對象,通過這個可以直接修改cin對象的狀態(能否從cin對象中讀取數據)

    2.cin和內存(各種對象,變量)之間:

      將cin中的數據讀取出來,並賦予各種對象,變量

    而這兩方面的功能都不由cin對象完成,cin對象實際上只是一個狀態數據量,1功能有外設(鍵盤)完成,2功能由<<和getline等等運算符完成

................................................

有了上面的對cin對象全方面的了解,接下來對>>運算符的分析就手到擒來了

    >>運算符的作用實際上就是從cin對象中讀取數據,並將數據賦予給右側的各種對象或者變量,也就是上述的第2部分的功能了

     那么>>運算符有哪些特性呢?畢竟輸入輸出總得控制開始和結束吧

      1.>>運算符是由右側的數據類型定義的,右側的數據類型不同,重載的>>也不同

      2.>>運算符是向左結合的

      3.>>運算符從cin對象中讀取數據時:如果遇到空格或者換行符號,那么這次讀取數據結束,將空格之前的數據賦給右側的運算對象,相應的,讀取的第一個符號,也是空格或者換行符之后的第一個有效數據

      4.一個>>運算符一次只能讀取一次(一個)數據,要想讀取多個數據,只能再加>>運算符

......................................................................


好吧,以上4個,就是>>的性質了,那么有些人又要問了,那么Ctrl+Z(~Z)文件結束符號又是怎么一回事呢?

其實這個文件結束符和>>完全就是風馬牛不相干,有些人總是將Ctrl+z和>>聯系在一起

      文件結束符號:就是cin對象功能一中的一個性質!也就是說,你可以把文件結束符看成是外設的功能:

      一旦從外設中遇到文件結束符(或者是無效的輸入),cin對象的狀態就會變為假!!,也就是說外設多不能向cin對象寫值了!!!

      自然<<運算符號就無效了

.......................................................

主體的知識已經講完了,說穿了,就是要理解,cin對象其實是面向兩方面的功能,要分清楚這兩方面的功能對應的各種情況

 

 

 

 

...........

接下來是一點補充

又有人又會問,那么getline又是什么鬼呢?

其實geline沒什么神秘的,它只不過是一種特殊的cin罷了

特殊體現在:

    1.它是String對象定義的,只能string對象用(當然<<也是String對象重載的)

    2.getline遇到空格不結束!!!也就是說它可以從cin對象中讀取空格!!當然,遇到換行仍然結束,但是他也會讀取換行符,但是讀取換行符之后后停止讀取,然后將讀取的數據(此時包括換行符)賦給右側的運算對象(x,見下),賦值的時候,丟棄換行符!!!,也就是說換行符不存到x中

getline的返回值是流參數和cin>>表達式一樣,返回cin>>

    3.getline是一個函數的形式:

    調用如下:

  string x;

  getline(cin ,x);返回值為cin的狀態

          

 


免責聲明!

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



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