C 輸入輸出

2021-10-03 02:47:13 字數 4939 閱讀 4486

一、cin概述

cin是c++中的乙個物件,輸入流物件

使用者在命令列輸入的內容最終會傳送到cin輸入流中

cin會忽略掉輸入中所有的space,enter,tab按鍵

傳送給cin的輸入被緩衝,只有當使用者按下enter鍵,輸入的內容才會傳送給程式

cin >> ch,ch只從cin中取第乙個字元

二、檔案結尾

1.檔案結尾用eof表示,在鍵盤中用enter或者ctrl+z與enter的組合

2.當cin檢測到eof時,會將eofbit和failbit都設定為1.

cin.eof()函式可以檢視eofbit是否被設定,如果檢測到eof,則cin.eof()將返回bool值true,否則返回false。

cin.fail()函式,對於eofbit或failbit被設定為1,則函式返回true,否則返回false。

三、cin特性

cin.get(char)的返回值為cin,當cin出現在需要bool值得地方(如在while迴圈的測試條件中)時,該轉換函式將被呼叫。如果最後一次讀取成功,則轉換得到的函式為true,否則為false。需要注意的是,如果cin讀取成功,首先將值放入char中,然後程式獲取函式呼叫的返回值,即cin。接下來,程式對cin進行bool轉換,如果輸入成功,則結果為true,否則為false.如果cin遇到eof,則表示cin讀取失敗,並且不會將eof放入char中,並返回false.

cin.get()函式,與c中的getchar()類似,返回輸入中的下乙個字元,將字元編碼作為int值返回,當遇到eof時,將沒有可返回的字元,cin.get()返回乙個用符號常量eof表示的特殊值,在iostream中定義,eof通常定義為-1,因為ascii中沒有字元對應的ascii碼為-1.需要注意的是eof不表示輸入中的字元,而是表示沒有字元了。

因為eof不是有效字元,如果char沒有型別,所以char不可能為eof,所以接收cin.get()的變數應該為int型別,而不是char型別,儲存字元的ascii即可。

四、cout特性

1.cout與cin一樣,是乙個輸出流

2.cout << char,注意cout會將char按照字元方式輸出,如果需要輸出char的ascii,則需要cout << int (char)

3.一般來說,如果給cout乙個指標,它將列印位址,如果指標的型別為char *,則cout將顯示指向的字串。如果要顯示的是字串的位址,則必須將這種指標強制轉換為另一種指標型別,如int *,因此ps顯示字串「fox」,(int *)ps顯示字串的位址。

五、陣列與字串

1.陣列名被c/c++解釋為第乙個元素的位址,而不是陣列的位址,只是在數值上,與陣列的位址值一樣,即(int *)&a == &a[0],所以陣列名就是乙個char *常量

2.c++中將char陣列名,char指標以及用引號括起來的字串常量均解釋為字串中第乙個字元的位址,而不是一整個字串,所以陣列名就是乙個char *

六、世上本無char

1.char本質上就是int,比如char = 'm』或者char= 77,char字元變數在記憶體中儲存的值就是字元『m』對應的ascii值77。所以cin >> ch,cin將鍵盤中的m字元轉換為77,儲存到ch變數中,cout將ch中的77轉換為『m』字元顯示出來。所以c中的printf要列印字元就用%c,列印ascii值就用%d.

七、函式只有原型,變數只有宣告

1.函式只有定義和原型,一般在編譯的時候,如果使用到某個函式,編譯器只找函式的原型,如果找不到原型,編譯將報錯。原型主要說明函式的名稱,引數型別,返回值型別

2.在使用變數的時候,編譯器只找變數的宣告,找不到宣告將報錯。變數的宣告主要說明變數的型別。

八、c++命名空間

1.宣告所有std物件

using namespace std

2.宣告指定物件

using std:cout

using std:cin

using std:endl

3.只在使用時宣告

std:cout << 「hello, i love c++」; std:cin.get(ch)

九、再論cin

cin如何確定已完成字串的輸入呢?

一般字串結尾標記為空字元,即『\0』,但是鍵盤無法輸入空字元,所以cin使用空白(空格、製表符、換行符)來確定字串的結束位置。cin在「hello alice!」輸入流中唯讀走hello,遇到空格認為字串結束了,並將"hello"字串儲存到字元陣列中,並自動在末尾加上』\0』。而「alice」字串仍然停留在輸入流中,假如cin繼續讀取,看到的第乙個字元將是』a』還是空格呢?cin以空字元作為判斷,應該是將空字元讀走,這個可以進行驗證。另外,cin並不讀走輸入流中的換行符,因為cin看到換行符需要換行。已經驗證,cin將空格處理掉了,下乙個字元為』a』字元。如果cin遇到空格怎麼辦?如果一開始便輸入空格,cin認為沒有字元。

cin.getline()與cin.get()

這兩個函式都是面向行的,都是讀取一行輸入,直到達到換行符。然而,隨後getline()丟棄換行符,也就是輸入流中沒有換行符了,而get()將換行符保留在輸入流中。所以get()與getline()在輸入流中只要遇到換行符,便認為字串結束了

getline()函式讀取整行,它使用通過回車鍵輸入的換行符來確定輸入結尾。cin.getline(name, 20),最多讀取19個字元,剩餘乙個字元自動在結尾處新增空字元『\0』。getline停止的條件是讀到指定數目的字元或遇到換行符時停止讀取。

「hello』\n』」,只讀取hello,並扔棄輸入流中的』\n』

「helo, weoaklsdjfladjflasdf」,讀取前19個字元,剩下字元留在輸入流中,將讀取的19個字元儲存在字元陣列中,並在字元陣列末尾新增』\0』。

getline通過換行符來確定行尾,但不儲存換行符,相反在儲存字串時,它用空字元來替換換行符。

get(name, count)函式與getline()函式的區別在於,get遇到換行符後不再讀取並丟棄換行符,而是將其留在輸入佇列中。假如有如下兩次呼叫:

cin.get(name, arsize);

cin.get(dessert, arsize); //出問題

由於第一次呼叫後,換行符將留在輸入佇列中,因此第二次呼叫時看到的第乙個字元便是換行符。因此cin.get(dessert, arsize)認為已經到達行尾,而沒有發現任何可讀取的內容。

get()不帶引數的函式可讀取下乙個字元(即使是換行符),如果使用以下方式,則是沒有問題的。

cin.get(name, arsize);

cin.get();

cin.get(dessert, arsize);

或者cin.get(name, arsize).get().get(dessert, arsize);

或者cin.getline(name1, arsize).getline(name2, arsize);

5.cin >> year; cin.getline(address, 80);當cin讀取年份後,將回車鍵的換行符留在了輸入流中,後面的cin.getline()看到換行符認為是乙個空行,將乙個空字元賦給陣列address.

6.只有getline會讀走輸入流中的換行符並扔掉。

十、cin輸入

輸入流:38.5 19.2

a.char ch; cin >> ch;

cin只從輸入流中讀取乙個字元3,轉換為ascii碼(字元編碼)儲存在變數ch中,輸入佇列中的下乙個字元為8,顯示的為字元3,二進位制編碼為3對應的ascii碼

b.int n; cin >> n;

cin將不斷讀取輸入流,直到遇到非數字字元,所以只讀取38,句點成為輸入流中的下乙個字元。所以n儲存的就是二進位制38

c.double n; cin >> n;

cin將不斷讀取,直到遇到第乙個不屬於浮點數的字元。所以cin讀取38.5,空格成為輸入佇列中的下乙個字元,二進位制編碼為38.5

d.char word[50]; cin >> word;

cin將不斷讀取,直到遇到空白字元(空格,製表符,換行),所以字元陣列中儲存的字元為38.5四個字元,記憶體中儲存的為字元對應的ascii碼的二進位制值,並在末尾加上乙個空字元(』\0』)。

e.char word[50]; cin.getline(word, 50);

cin將不斷讀取,直到遇到換行符,cin將讀到的所有字元存入word陣列中,並在末尾加上乙個空字元(『\0』)。輸入流中換行符被丟棄。而預設的cin不會丟棄輸入流中的換行符。所以下乙個cin看到換行符,就知道預設是要換行。

f.cin對於輸入中空格,如果整數讀完,後面有空格,則扔掉,double也是一樣,但是其他字元保留。對於換行,如果cin一開始遇到換行,cin不做特殊處理,不讀,忽略,而getline一旦遇到,則認為是空行,賦值為空字元。get()帶引數也是一樣,認為空行,因為它倆以換行為字串終結,但是get不處理換行,getline處理換行。另外get不帶引數可以讀走換行。cin讀到陣列,以空白字元為字串分隔,而get()帶引數和getline是面向行的,不是面向字串,只認換行符。

十一、cin的優化

infile的優化,理論上,infile輸入完後,要麼是遇到eof結束,要麼是輸入不匹配,要麼是輸入ok,所以infile.good()能檢測出infile的實際結果;而infile >> value本身也是有返回值,返回值為infile,在需要bool的情況下,該結果與infile.good()結果一致

infile >> value;

while(infile.good())

while(infile >> value)

下面分析過程與上述類似,程式首先呼叫cin.get(ch),如果成功,將值放入ch中,然後程式獲得函式呼叫的返回值,即cin。接下來,程式對cin進行bool轉換,如果輸入成功,則結果為true,否則為false。

cin.get(ch)

while(cin.fail() == false)

while(cin.get(ch))

十二、cin.get() / cin.get(char) / cin.get(char, size)

C 輸入輸出

一 標準輸入函式cin 不知道說它是個函式對還是不對,它是代表標準的輸入裝置 鍵盤。他是屬於流的,他的用法和流的用法是一樣的。也就是 cin 變數 小小的說明一下,輸入多個變數可以寫在一行,如 cin x y z 這樣寫不是不允許,而是不好看,如果是不同的變數型別,那就更是沒頭沒腦了。除了你,人家是...

C 輸入輸出

c語言不提供輸入輸出語句,輸入輸出操作有函式來實現。c的標準庫函式中提供了許多輸入輸出函式,如printf scanf 等,使用時需要新增相應的標頭檔案 scanf d num 逗號前為控制語句,後半部分為變數的位址。當中 d是輸入格式控制字串 scanf 函式在接受輸入資料是預設不採集空格,回車,...

C 輸入輸出

c 中的一些常用輸入輸出 include include include include using namespace std void win io 由控制台輸入 void file io 檔案進行輸入 in file.close void file io 2 in file.close in ...