C 中讀取一行資料 get和getline

2021-06-29 08:16:59 字數 2360 閱讀 3682

在c++中最常用到的輸入自然是cin了,但它有個缺點就是當輸入有空格時,只能讀取到空格前面的內容。我們自然是希望能夠讀取到一整行的內容了。好在c++中提供了兩個函式:getgetline, 也就是這篇文章的主角了。先從getline開始吧。

當我們想從輸入流中讀取到一行資料時,我們可以這樣呼叫cin.getline(buf, size), 讀取指定長度的字串或遇到換行符時結束並將結果儲存在buf中。getline()通過換行符來確定結尾,但不儲存換行符。還有其他的幾個過載函式,這裡就不多說了。

cin.get(buf, size)也是讀取一行資料,但它不讀取末尾的換行符,換行符會被保留在輸入佇列中,也就是說,當第一次呼叫後,換行符留在輸入佇列中,因此第二次呼叫的時候看到的第乙個字元便是換行符。可使用cin.get()讀取下乙個字元(即使是換行符)。也可以這樣使用cin.get(buf,size).get()

get()測試**:

#include

using

namespace

std;

int main()

注釋掉cin.get()的時候可以看到:

當第一次輸入回車後還沒等到第二次輸入結果就已經出來了!加上cin.get()就可以正常輸入第二個字串了。

好的,那麼問題來了。既然getline()get()方便那麼多,為什麼還要有get()呢?

毫無疑問,getline()比起get()用起來要方便得多。但你是否想過這樣乙個問題:當使用者輸入的字串的長度超過了我們定義的size,這時候我們該如何檢測呢?如果說不管它的話,因為剩下的字串還在輸入流中,如果還有第二次的使用者輸入的話,程式就直接從輸入流中提取字串了。很明顯,這是乙個嚴重的bug。所以我們就得找個辦法來檢測這種情況。聰明的你可能已經想到了get()的優勢了。沒錯,就是利用這次看似多餘的cin.get()來判斷取得的字元是不是換行符,如果是的話證明我們讀取到了整個字串了。而getline()要檢測就比較麻煩了。這個比較簡單,這裡就不再給出例子了。大家可以動手寫一寫,理解就會更深了。

getline()get()還有乙個大的區別:當get()讀取到空行時會設定失效位(failbit),這意味著接下來的輸入都被阻斷,但可以用cin.clear()來恢復。getline讀取到空行時則不會有這個問題。

看一下例子吧:

#include

using

namespace

std;

int main()

*/cout

<< "the string is: "

<< str << endl;

deletestr;

str = new

char[size];

cout

<< "請再次輸入字串: ";

cin.get();

cin.get(str, size);

cout

<< "the string now is: "

<< str << endl;

deletestr;

return

0;}

執行程式,然後輸入回車,可以看到這樣的結果:

當回車後,程式並沒有執行第二次的輸入,而是直接輸出了結果。

把上面的**中的注釋去掉後就能看到正確的結果了,比如:

getline()get()應該是還有其它的區別的,等以後遇到了再補上吧。

最後還有一點要提醒的就是,對指標使用new之後一定要用delete掉,否則可能會造成記憶體洩露!!!

C 讀取excel最後一行資料

如何讀取excel檔案 csv檔案的最後一行資訊,查閱網上各種資料,有直接操作excel表的 c 讀取excel檔案的三種經典方法 但這不是我想要的 讀取txt檔案的最後一行內容,有兩種思路 1.先讀取檔案的總行數,再獲取最後一行的內容,這種方法很簡潔,但是存在問題是當檔案資料量很龐大,比如有上萬行...

openpyxl 讀取excel中某一行資料

記錄一下本人做專案ui自動化中讀取excel中資料的操作,只是封裝了讀取某一行資料的功能 import openpyxl class excel def init self,filename self.file name filename def get rows value self,sheetn...

C語言一行一行讀取檔案

c語言中,使用fgets函式可以一行行讀du取檔案。1 fgets函式 原型 char fgets char buf,int bufsize,file stream 功能 從檔案結構體指標stream中讀取資料,每次讀取一行。說明 讀取的資料儲存在buf指向的字元陣列中,每次最多讀取bufsize ...