日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

getline用法

發布時間:2024/3/12 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 getline用法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

getline函數是一個比較常見的函數。根據它的名字我們就可以知道這個函數是來完成讀入一行數據的。現在對getline函數進行一個總結。

在標準C語言中,getline函數是不存在的。
下面是一個簡單的c語言實現方式: int getline_(char s[],int lim){
int c,i;
i=0;
while((c=getchar())!=EOF&&c!='\n'&&i<lim-1)
?s[i++]=c;
s[i]='\0';
return i;
}
下面是一個簡單的測試程序: int test1(){
char s[100];
int len;
while((len=getline_(s,100))>0)
printf("%s\n",s);

return 0;
}
但是這個實現是有問題的,就是遇到空行的時候也會停止的。
為了解決這個問題,我們需要重新考慮while循環的判斷條件。
在上面的實現中,我們是遇到EOF和換行'\n'的時候都停止 ,然后通過判斷所讀到的字符串的長度是否大于0來判斷是否結束。
為了能讀入空行,我們需要判斷一下是否讀入的是結尾EOF,如果不是就繼續讀取就可以了。
還有一點,EOF是什么?
EOF是C語言中為了區分有效數據和輸入結束符的。
C語言采用的解決辦法是:在沒有輸入時getchar函數將返回一個特殊值,這個特殊值與任何實際字符都不同。這個值成為EOF(end of file ,文件結束)。我們在聲明變量c 的時候,必須讓它大到足以存放getchar函數返回的任何值。之所以不把c聲明成char類型,是因為它必須足夠大,除了能存儲任何可能的字符外還要能存儲文件結束符EOF。
EOF的輸入由系統鎖定。windows下是ctrl+z,linux/unix下是ctrl+d。

下面是給出的修改后的getline函數 int getline2_(char s[],int lim){
int c,i;
i=0;
while((c=getchar())!=EOF&&c!='\n'&&i<lim-1)
?s[i++]=c;
if(c==EOF&&i==0)
return -1;
s[i]='\0';
return i;
} 如果是文件結尾(c==EOF&&i==0)的話,我們就返回-1,通過判斷返回值是否為-1來決定是否繼續入輸入: int test1(){
char s[100];
int len;
while((len=getline2_(s,100))!=-1)
printf("%s\n",s);

return 0;
} 這樣話就可以正確讀入所有的輸入了。

在gcc編譯器中,對標準庫進行了擴展,加入了一個getline函數。該函數的定義如下:
#include?
ssize_t getline(char **lineptr, size_t *n, FILE *stream); 其中*lineptr指向一個動態分配的內存區域。*n是所分配內存的長度。如果*lineptr是NULL的話,getline函數會自動進行動態內存的分配(忽略*n的大小),所以使用這個函數非常注意的就使用要注意自己進行內存的釋放。
如果*lineptr分配了內存,但在使用過程中發現所分配的內存不足的話,getline函數會調用realloc函數來重新進行內存的分配,同時更新*lineptr和*n。
注意*lineptr指向的是一個動態分配的內存,由malloc,calloc或realloc分配的,不能是靜態分配的數組。
下面是使用這個函數情況,事先分配了動態內存。 void test2(){
int read;
int len=100;
char *line=NULL;
if((line=malloc((len+1)))==NULL){
printf("Can't get memory\n");
exit(-1);
}
while((read=getline(&line,&len,stdin))!=-1)
printf("%s\n",line);
free(line);

}
下面是一個沒有提前進行內存分配的情況: void test3(){
int read;
int len=0;
char *line=NULL;
while((read=getline(&line,&len,stdin))!=-1)
printf("%s\n",line);
free(line);
}
同樣最后要進行內存的釋放。
這兒還要注意一個問題就是,getline函數讀入的一行是包括最后的換行符的。之前我們寫的函數是不包括這個的。下面我們進行修改一下,也讀入換行符。 int getline3_(char s[],int lim){
int c,i;
i=0;
while((c=getchar())!=EOF&&c!='\n'&&i<lim-1)
?s[i++]=c;
if(c==EOF&&i==0)
return -1;
if(c=='\n')
s[i++]=c;
s[i]='\0';
return i;
}
這樣也讀入了換行符。這樣的話,這個getline函數就不錯了。

在C++中為了使用的方便,C++在標準庫中添加了getline函數。
其實在C++中對不同的輸入流對象都定義了一個getline函數,即:
std::fstream::getline
std::istream::getline
std::ifstream::getline
std::iostream::getline
std::wfstream::getline
std::wistream::getline
std::wifstream::getline
std::wiostream::getline
std::stringstream::getline
std::basic_fstream::getline
std::basic_istream::getline
std::istringstream::getline
std::wstringstream::getline
std::basic_ifstream::getline
std::basic_iostream::getline
std::wistringstream::getline
std::basic_stringstream::getline
std::basic_istringstream::getline 這兒我們討論標準輸入對象的getline函數,其他的對象的情都是類似的。
在頭文件中聲明了getline函數:
istream::getline
istream& getline (char* s, streamsize n );
istream& getline (char* s, streamsize n, char delim ); 函數是C類型的數組。因為C++中允許對函數進行重載,所以可以有多個同名函數。delim參數是指定分隔符。如果不指定的話,默認使用'\n'
下面是一個例子:
void test1(){
char line[100];
while(cin.getline(line,100))
cout<<line<<endl;
?}
注意這兒的getline是要讀入空白符。但是不包括最后的換行符。

C++中還定義了一個在std名字空間的全局函數,因為這個getline函數的參數使用了string字符串,所以聲明在了頭文件中了。
聲明如下:
istream& getline ( istream& is, string& str, char delim );
istream& getline ( istream& is, string& str ); 簡單的示例如下:
void test2(){
string line;
while(getline(cin,line))
cout<<line<<endl;
?}
注意此處也是不讀入換行符的。
所以在C++中讀取一行的函數是不讀入換行符的,而GCC中getline函數是讀入換行符的。可以理解為,一般情況下不讀入,特別的是GCC的讀入。

C/C++中的getline()

getline不是C庫函數,而是C++庫函數。它會生成一個包含一串從輸入流讀入的字符的字符串,直到以下情況發生會導致生成的此字符串結束。1)到文件結束,2)遇到函數的定界符,3)輸入達到最大限度。
注釋: 在函數遇到和結束定界符相等的字符時函數結束,同時函數抽出定界符,此種情況下該定界符既不被放回輸入流,也不被放入要生成的字符串。所以由此可以理解輸入結束后的第一個回車是定界符,被確認后拋棄,而第二個才是程序執行運行時正常需要的!

C++有getline()函數.
C 有 fgets(), gets() 函數,也有getline.
用于讀取一行字符直到換行符,包括換行符(換行符用'\0'替換掉了).
使用條件
linux標準C中使用條件:
#define _GNU_SOURCE
#include?
函數聲明:
ssize_t getline(char **lineptr, size_t *n, FILE *stream);
返回值
成功:返回讀取的字節數。
失敗:返回-1。
參數:
lineptr:指向存放該行字符的指針,如果是NULL,則有系統幫助malloc,請在使用完成后free釋放。
n:如果是由系統malloc的指針,請填0
stream:文件描述符
?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 #define _GNU_SOURCE #include <stdio.h> #include <stdlib.h> ssize_t getline(char **lineptr, size_t *n, FILE *stream); 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); }</stdlib.h></stdio.h>
C++格式的cin.getline()
?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 #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; a="" ch="<<ch; ????if(ch=='\n') ????{ ????????cout<<" ch2=""<<ch2;" char="" cout="" equals="" line="" new="" operator="" pre="" return="">C++中有兩個getline函數,這兩個函數分別定義在不同的頭文件中。 1.getline()是定義在<string>中的一個行數,用于輸入一行string,以enter結束。 函數原型:getline(cin,str); cin:istream類的輸入流對象 str:待輸入的string對象<pre class="brush:java;">//《C++ primary plus》第四章編程練習題1 #include <iostream> #include <string> using namespace std; string fname; string lname; char grade; int age; int main() { ???cout<<"What is your first name?"; ???getline(cin,fname); ???cout<<"What is your last name?"; ???getline(cin,lname); ???cout<<"What letter grade do you deserve?"; ???cin>>grade; ???cout<<"What is your age?"; ???cin>>age; ???cout<<"Name:"<<lname<<","<<fname<<endl<<"grade:" pre="">2.cin.getline(char ch[],size)是cin 的一個成員函數,定義在<iostream>中,用于輸入行指定size的字符串,以enter結束。若輸入長度超出size,則不再接受后續的輸入。<pre class="brush:java;">//《C++ primary plus》第四章編程練習題1 #include <iostream> using namespace std; char fname[5]; char lname[5]; char grade; int age; int main() { ????cout<<"What is your first name?"; ????cin.getline(fname,5); ????cout<<"What is your last name?"; ????cin.getline(lname,5); ????cout<<"What letter grade do you deserve?"; ????cin>>grade; ????cout<<"What is your age?"; ????cin>>age; ????cout<<"Name:"<<lname<<","<<fname<<endl<<"grade:"<<grade<<endl<<"age:"< </lname<<","<<fname<<endl<<"grade:"<<grade<<endl<<"age:"<</iostream></pre> </iostream></lname<<","<<fname<<endl<<"grade:"></string></iostream></pre> </string></c<<endl;></iostream>

總結

以上是生活随笔為你收集整理的getline用法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。