-
getline函數
鎖定
getline是C++標準庫函數;但不是C標準庫函數,而是POSIX(IEEE Std 1003.1-2008版本及以上)所定義的標準庫函數(在POSIX IEEE Std 1003.1-2008標準出來之前,則只是GNU擴展庫裏的函數)。getline會生成一個包含一串從輸入流讀入的字符的字符串,直到以下情況發生會導致生成的此字符串結束:1)到文件結束,2)遇到函數的定界符,3)輸入達到最大限度。
- 中文名
- 函數
- 外文名
- getline
- 類 別
- 編程
- 特 點
- 生成數字
getline函數名詞釋義
在函數遇到和結束定界符相等的字符時函數結束,同時函數抽出定界符,此種情況下該定界符既不被放回輸入流,也不被放入要生成的字符串。所以由此可以理解輸入結束後的第一個回車是定界符,被確認後拋棄,而第二個才是程序執行運行時正常需要的。
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
stream:文件描述符
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]
。
當輸入的字符數小於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頁