複製鏈接
請複製以下鏈接發送給好友

getline函數

鎖定
getline是C++標準庫函數;但不是C標準庫函數,而是POSIX(IEEE Std 1003.1-2008版本及以上)所定義的標準庫函數(在POSIX IEEE Std 1003.1-2008標準出來之前,則只是GNU擴展庫裏的函數)。getline會生成一個包含一串從輸入流讀入的字符的字符串,直到以下情況發生會導致生成的此字符串結束:1)到文件結束,2)遇到函數的定界符,3)輸入達到最大限度。
中文名
函數
外文名
getline
類    別
編程
特    點
生成數字

getline函數名詞釋義

成員函數getline()是從輸入流中讀取一行字符,讀到終止符時會將'\0'存入結果緩衝區中 [4]  ,作為輸入的終止。終止符可以是默認的終止符,也可以是定義的終止符。函數的語法結構是:
getline(<字符數組chs>,<讀取字符的個數n>,<終止符>) [1] 
在函數遇到和結束定界符相等的字符時函數結束,同時函數抽出定界符,此種情況下該定界符既不被放回輸入流,也不被放入要生成的字符串。所以由此可以理解輸入結束後的第一個回車是定界符,被確認後拋棄,而第二個才是程序執行運行時正常需要的。

getline函數應用範圍

C 有 fgets(),gets() 函數,gcc編譯器擴展定義了getline()函數。
用於讀取一行字符,包括換行符和字符串終止符。

getline函數使用條件

linux標準C中使用條件:
#if defined(_GNU_SOURCE) || _POSIX_C_SOURCE >= 200809L
#include <stdio.h>
函數聲明:
ssize_t getline(char **lineptr, size_t *n, FILE *stream);

getline函數返回值

成功:返回讀取的字節數。
失敗:返回-1。
參數:
lineptr:指向存放該行字符的指針,如果是NULL,則有系統幫助malloc,請在使用完成後free釋放。
n:如果是由系統malloc的指針,請填0

getline函數應用舉例

#if defined(_GNU_SOURCE) || _POSIX_C_SOURCE >= 200809L
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
FILE * fp;
char * line = NULL;
size_t len = 0;
ssize_t read;
fp = fopen("/etc/motd", "r");
if (fp == NULL)
exit(EXIT_FAILURE);
while ((read = getline(&line, &len, fp)) != -1)
{
printf("Retrieved line of length %zu :\n", read);
printf("%s", line);
}
if (line)
free(line);
exit(EXIT_SUCCESS);
}

getline函數獨特性(C++標準庫函數)

#include <iostream>
using namespace std;
int main( )
{
    cout << "Type the letter 'a': ";
    ws( cin );
    char c[10]={'\0'};
    cin.getline(c,10,'#');//將getline換成get試試,情況就大不相同了
    cout<<c<<endl;
    char ch=cin.get();
    cout<<"ch="<<ch;
    if(ch=='\n')
    {
        cout<<"ch equals a new line operator "<<endl;
    }
    char ch2=cin.get();
    cout<<"ch2= "<<ch2;
    cin.get(c,10);
    cout<<c<<endl;
    cout<<cin.readsome(c,4)<<endl;
    cout<<c<<endl;
    cout << cin.gcount( ) << endl;
    return 0;
}
get(char*array,int count,char delim)與getline(char*array,int count,char delim)的不同點:
成員函數get有三種版本:無參數的、帶一個參數的帶三個參數的。不帶參數的get函數從指定的輸入流中提取(輸入)一個字符(包括空白字符)並返回該字符;當遇到輸入流中的文件結束符時,返回EOF。為與 ASCII字符值有所區別,EOF的值通常為-1(不同系統中的EOF值有可能是不一樣的)。帶一個字符型參數的get成員函數自動提取輸入流中的下一個字符(包括空白字符)。當遇到文件結束符時,函數返回0(假),否則返回對 Istream對象的引用,並用該引用再次調用get函數。帶有三個參數的get成員函數,其三個參數分別是接收字符的字符數組、字符數組的大小和終止字符(默認值為'\n')。函數或者在讀取比指定的最多字符數少一個字符後結束,或者在遇到終止字符時結束。為使字符數組(被程序用作緩衝區)中的輸入字符串能夠結束,空字符會被插入到字符數組中。函數不把終止字符放到字符數組中,但是終止字符仍然會保留在輸入流中 [2] 
成員函數 getline與帶三個參數的get函數類似,它讀取一行信息到字符數組中然後插入一個空字符。所不同的是,getline要去除輸入流中的終止字符,但是不把它存放在字符數組中 [2] 
當輸入的字符數小於count時遇到字符delim,get函數不會讀取delim這個字符,而getline函數將讀取這個字符但是不存進array當中去,而是將其丟棄,當然,兩者都會在讀取的字符串後面自動加上'\0'(teminator character)
當輸入的字符數大於count時,則get函數只讀取count-1個字符,而其餘的字符仍然保存在緩衝區中,還可再對其進行讀取;但是函數getline則不然。
如果輸入行包含的字符數比指定要讀取的字符多,那麼get()和getline()讀取指定數目的字符後,將把餘下的字符留在輸入隊列中。對get()而言,我們可以用另一條讀取函數來讀取留在輸入隊列中的數據,你也可以寫一段代碼將餘下的字符清除。不同的是getline()會設置失效位(faibit),並且關閉後面的輸入,這個時候用ch=cin.get();是讀取不到留在輸入隊列中的字符的。你可以用下面的命令來恢復輸入:cin.clear();因為clear()會重置失效位,打開輸入。這個時候ch=cin.get();就可以讀取留在輸入隊列中的字符。
getline()接收一個字符串,可以接收空格,需要包含#in⁃clude<string>,getline()和cin.getline()類似,但是後者屬於istream流,而前者屬於string流 [3] 
外加ignore用法舉例一則:
// basic_istream_ignore.cpp
// compile with: /EHsc
#include <iostream>
int main( )
{
    using namespace std;
    char chararray[10];
    cout << "Type 'abcdef': ";
    cin.ignore( 5, 'c' );//忽略前5個字符除非遇到字符'c',而停止忽略字符
    //ignore的函數原型為:basic_istream& ignore(streamsize _Count = 1,int_type _Delim = traits_type::eof( ));(摘自MSDN)
    cin >> chararray;
    cout << chararray;
    cout<<endl<<endl;
    return 0;
}
參考資料
  • 1.    武馬羣主編 繆春池 呂峻閩 謝志龍編著. 高職高專計算機系列規劃教材 C++語言程序設計[M]. 2005:277頁
  • 2.    (美)H.M.Deitel P.J.Deitel. C/C++程序設計大全[M]. 1997:740-742頁
  • 3.    基於C++語言的外部輸入若干問題的探討  .中國知網[引用日期2019-11-10]
  • 4.    崔志磊主編. C++程序設計教程[M]. 2008 259頁