應用範圍
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
外加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;
}