getline函數

getline函數

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

應用範圍

C 有 fgets(),gets() 函數,gcc編譯器擴展定義了getline()函數。

用于讀取一行字符,包括換行符和字符串終止符。

使用條件

linux标準C中使用條件:

#if defined(_GNU_SOURCE) || _POSIX_C_SOURCE >= 200809L

#include 

函數聲明:

ssize_t getline(char **lineptr, size_t *n, FILE *stream);

返回值

成功:返回讀取的字節數。

失敗:返回-1。

參數:

lineptr:指向存放該行字符的指針,如果是NULL,則有系統幫助malloc,請在使用完成後free釋放。

n:如果是由系統malloc的指針,請填0

stream:文件描述符

應用範圍

C 有 fgets(),gets() 函數,gcc編譯器擴展定義了getline()函數。

用于讀取一行字符,包括換行符和字符串終止符。

使用條件

linux标準C中使用條件:

#if defined(_GNU_SOURCE) || _POSIX_C_SOURCE >= 200809L

#include 

函數聲明:

ssize_t getline(char **lineptr, size_t *n, FILE *stream);

返回值

成功:返回讀取的字節數。

失敗:返回-1。

參數:

lineptr:指向存放該行字符的指針,如果是NULL,則有系統幫助malloc,請在使用完成後free釋放。

n:如果是由系統malloc的指針,請填0

stream:文件描述符

應用舉例

#if defined(_GNU_SOURCE) || _POSIX_C_SOURCE >= 200809L

#include 

#include 

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);

}

獨特性(C++标準庫函數)

#include 

using namespace std;

int main( )

{

 cout << "Type the letter 'a': ";

 ws( cin );

 char c[10]={'0'};

 cin.getline(c,10,'#');//将getline換成get試試,情況就大不相同了

 cout<

 char ch=cin.get();

 cout<<"ch="<

 if(ch=='n')

 {

  cout<<"ch equals a new line operator "<

 }

 char ch2=cin.get();

 cout<<"ch2= "<

 cin.get(c,10);

 cout<

 cout<

 cout<

 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')。函數或者在讀取比指定的最多字符數少一個字符後結束,或者在遇到終止字符時結束。為使字符數組(被程序用作緩沖區)中的輸入字符串能夠結束,空字符會被插入到字符數組中。函數不把終止字符放到字符數組中,但是終止字符仍然會保留在輸入流中。

成員函數 getline與帶三個參數的get函數類似,它讀取一行信息到字符數組中然後插入一個空字符。所不同的是,getline要去除輸入流中的終止字符,但是不把它存放在字符數組中。

當輸入的字符數小于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,getline()和cin.getline()類似,但是後者屬于istream流,而前者屬于string流。

外加ignore用法舉例一則:

// basic_istream_ignore.cpp

// compile with: /EHsc

#include 

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<

 return 0;

}

相關詞條

相關搜索

其它詞條