c++清空输入缓冲区_干货 | C++的输入输出方法
? ?C和C++并沒有將輸入與輸出實現在語言中,而是在類庫中實現。作為C的超集,C++繼承了C的輸入輸出方法。同時將輸入與輸出視為字流。流充當了程序和流源流目標之間的橋梁。本文將介紹C++的輸入輸出方式,并且淺談C與C++均有的輸入輸出方式
對C++有一定學習的同學可以很輕松的寫出一下代碼
在這段代碼中,我們聲明了包含了iostream庫,聲明了整型變量a,訪問名詞空間std用其中的對象cin在流提取運算符>>的作用下輸入了變量a,再次訪問名詞空間std,其中的對象cout在流插入符的作用下插入變量a到輸出流從而輸出。
下面我們來淺顯的分析一下這段代碼。
首先是類庫iostream.iostream的意思是輸入輸出流,直接點說就是in(輸入)out(輸出)stream(流),取in、out的首字母與stream合成。iostream庫的基礎是兩種命名為istream和ostream的類型,分別表示輸入流和輸出流。流是指要從某種IO設備上讀出或寫入的字符序列。術語“流”試圖說明字符是隨著時間順序生成或消耗的。標準庫定義了4個IO對象。處理輸入時使用命名為cin的istream類型對象。這個對象也稱為標準輸入。處理輸出時使用命名為cout的ostream類型對象,這個對象也稱為標準輸出。標準庫還定義了另外兩個ostream對象,分別命名為cerr和clog。cerr對象又叫作標準錯誤,通常用來輸出警告和錯誤信息給程序的使用者。而clog對象用于產生程序執行的一般信息。
一、輸入流與輸出流的基本操作
輸入和輸出并不是C++語言中的正式組成成分。C和C++本身都沒有為輸入和輸出提供專門的語句結構。輸入輸出不是由C++本身定義的,而是在編譯系統提供的I/O庫中定義的。C++的輸出和輸入是用“流”(stream)的方式實現的。圖3.2和圖3.3表示C++通過流進行輸入輸出的過程。
有關流對象cin、cout和流運算符的定義等信息是存放在C++的輸入輸出流庫中的,因此如果在程序中使用cin、cout和流運算符,就必須使用預處理命令把頭文件stream包含到本文件中:
盡管cin和cout不是C++本身提供的語句,但是在不致混淆的情況下,為了敘述方便,常常把由cin和流提取運算符“>>”實現輸入的語句稱為輸入語句或cin語句,把由cout和流插入運算符“<
cout語句的一般格式為:cout<
cin語句的一般格式為:cin>>變量1>>變量2>>……>>變量n;
在定義流對象時,系統會在內存中開辟一段緩沖區,用來暫存輸入輸出流的數據。在執行cout語句時,先把插入的數據順序存放在輸出緩沖區中,直到輸出緩沖區滿或遇到cout語句中的endl(或'\n',ends,flush)為止,此時將緩沖區中已有的數據一起輸出,并清空緩沖區。輸出流中的數據在系統默認的設備(一般為顯示器)輸出。
在用cins輸入cout輸出時,我們不必通知計算機按何種類型輸出,系統會自動判別輸出數據的類型,使輸出的數據按相應的類型輸出。例如
我們可以同時對整型變量a浮點型b,字符型c,字符串型d進行輸入輸出。
二、在輸入流與輸出流中使用控制符
上面我們介紹的是使用cout和cin時的默認格式。但有時人們在輸入輸出時有一些特殊的要求,如在輸出實數時規定字段寬度,只保留兩位小數,數據向左或向右對齊等。C++提供了在輸入輸出流中使用的控制符(有的書中稱為操縱符)。
需要注意的是:如果使用了控制符,在程序單位的開頭除了要加iostream頭文件外,還要加iomanip頭文件。
例一:輸出雙精度數程序結果
例二:整數輸出程序結果
三:輸入的技巧淺談
下面我們通過幾個情景來講解一部分輸入的技巧1輸入一行字符,其中含有空格。再次使用cin會再中途遇到空格時停止讀入,所以我們可以使用getline函數來完整的讀入一行。此函數在庫string中。
效果如圖
其函數原型如下
下面我們簡單的分析一下這個函數
01這個函數返回的是一個流對象,這個暫時我們不討論,但注意cin返回的亦是一個流對象。然后便是函數的參數,第一個參數是一個istream的輸入流對象,這里我們用cin就好。然后便是一個字符串參數,表示我們要把從istream對象輸入進來的數據存放在那個字符串里面。最后一個參數是截至字符,表示讀到該字符后停止輸入,默認為換行字符’\n’
02輸入任意行字符,其中有空格。可以理解為輸入一篇文章。將getline函數放入while循環中不斷讀入。由于getline函數返回一個流對象,所以可以作為bool值進行判斷,所以我們就可以不斷調用函數,直到沒有字符讀入為止。
假設文章不超過maxn行
03讀入若干行整數,每行整數數量不確定,求每行的和及輸入的整數的個數
解決方案:把讀入的一整行字符串再次轉換成一條輸入流,讀入到整數中,將字符串轉化成輸入流需要包含庫sstream
效果圖如下
四
輸入輸出的運算符重載隨著編程的復雜程度提升,我們不滿足于語言自
帶的數據類型,開始定義了類來實現模塊化編程,但是如果又追求實現簡潔優雅的用cincout 來輸入輸出對象,這時候我們就可以實現對插入運算符<>的重載來達到我們的目的.
然后我們就可以愉快的輸入輸出student類了
效果如圖
文件的輸入輸出到目前為止,我們的輸入輸出都只是建立再對終端窗口的交互之中。在實際中,更多的是從文件中讀入和輸出數據。接下來,我們介紹若干種對文件中數據的讀入和寫入的方式。freopen我們先包含一個包含庫cstdio,便可以調用freopen函數,之后我們的輸入輸出都會重定向到指定文件。
函數原型如下
參數說明:
path:文件名,用于存儲輸入輸出的自定義文件名。
mode:文件打開的模式。和fopen中的模式(如r-只讀,w-寫)相同。
stream:一個文件,通常使用標準流文件。
返回值:成功,則返回一個path所指定文件的指針;失敗,返回NULL。功能:實現重定向,把預定義的標準流文件定向到由path指定的文件中。標準流文件:具體是指stdin、stdout和stderr。其中stdin是標準輸入流,默認為鍵盤;stdout是標準輸出流,默認為屏幕;stderr是標準錯誤流,一般把屏幕設為默認。使用fstream聲明文件讀寫變量。
ofstream是從內存到硬盤,
ifstream是從硬盤到內存,其實所謂的流緩沖就是內存空間;在C++中,有一個stream這個類,所有的I/O都以這個“流”類為基礎的,包括我們要認識的文件I/O。
一、打開文件在fstream類中,有一個成員函數open(),就是用來打開文件的,其原型是:
voidopen(const char* filename,int mode,int access);
filename:要打開的文件名
mode:要打開文件的方式
access:打開文件的屬性打開文件的方式在類ios(是所有流式I/O類的基類)中定義,常用的值如下:
ios::app:以追加的方式打開文件
ios::ate:文件打開后定位到文件尾,ios:app就包含有此屬性
ios::binary:以二進制方式打開文件,缺省的方式是文本方式。
ios::in:文件以輸入方式打開(文件數據輸入到內存)
ios::out:文件以輸出方式打開(內存數據輸出到文件)
ios::nocreate:不建立文件,所以文件不存在時打開失敗
ios::noreplace:不覆蓋文件,所以打開文件時如果文件存在失敗
ios::trunc:如果文件存在,把文件長度設為0,可以用“或”把以上屬性連接起來,如ios::out|ios::binary
二、關閉文件打開的文件使用完成后一定要關閉,fstream提供了成員函數close()來完成此操作,如:file1.close();把file1相連的文件關閉。
下面是一個簡單的示例程序
這個程序我們先把前100個偶數寫入到了1.txt文件中,然后再讀入求和。如果想了解更多C++的語法和實現,可以參考http://www.cplusplus.com/或者參考C++prime
?文案:榮思齊
排版:許宗清
總結
以上是生活随笔為你收集整理的c++清空输入缓冲区_干货 | C++的输入输出方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 美国今年财政赤字将达3.3万亿美元,创历
- 下一篇: 信用卡还款优先顺序