2011-03-06 55 views
1

我正在嘗試一行一行地顯示命令行輸入文本文件的文本。但由於某種原因,它會跳過第一行後每行的第一個單詞。爲什麼cin.getline()跳過每行中的第一個單詞?

代碼:運行./a.out < moby.txt

using std::cout; 
using std::cin; 
using std::endl; 

int main (int args, char* argv[]) 
{ 
char x[100]; 
char y[100]; 
char z[100]; 
cin.getline(x,100) >> argv[2]; 
cin.getline(y,100) >> argv[2]; 
cin.getline(z,100) >> argv[2]; 
cout << x <<endl; 
cout << y <<endl; 
cout << z <<endl; 
return 1; 
} 

顯示此:

CHAPTER 1. Loomings. 

me Ishmael. Some years ago--never mind how long precisely--having 
or no money in my purse, and nothing particular to interest me on 

但前三行中moby.txt是這樣的:

CHAPTER 1. Loomings. 

Call me Ishmael. Some years ago--never mind how long precisely--having 
little or no money in my purse, and nothing particular to interest me on 

代碼省略了「Call」和「little」。
我覺得這是一個\ n錯誤,但我不知道如何解決它。 在此先感謝您的幫助。

+1

cin.getline(y,100)>> argv [2] ;.我將不得不記住,下次我真的希望**在每一行的開始處跳過某些​​內容。我的同事永遠不會猜到它的作用! – 2011-03-06 09:41:33

回答

5
cin.getline(x,100) >> argv[2]; 

您將一行(或該行的前99個字符)讀入x。然後你跳過任何空格並讀入argv[2]的下一個單詞。第一句話結束了。

爲什麼使用>> argv[2]?你可能試圖用這個做什麼? argv[2]可能不存在,即使它存在,您也無法控制由argv[2]指向的字符數組的大小,因此超出該數組的機會非常高。

比直接使用char陣列此相反,使用std::getlinestd::string讀線到std::string對象:這是很容易編寫正確的代碼這種方式。例如,

std::string x; 
if (!std::getline(std::cin, x)) { 
    // handle input error 
} 
+0

@ user646651:你認爲''argv [2]'正在做什麼,你爲什麼寫這個? – 2011-03-06 05:14:58

+0

我的意思是argv [2]是從命令行參數輸入的moby.txt文件。所以我的意思是用這行代碼將moby.txt文件讀入cin.getline(x,100)。 – user646651 2011-03-06 05:21:13

+0

@ user646651:編號'argv [2]'是一個char *'。'>> argv [2]'跳過任何空格字符,然後從流(本例中爲'std :: cin')讀取下一個字到'char *'指向的字符數組中。 'moby.txt'的內容可以通過'std :: cin'獲得:這就是命令行上的的功能。 – 2011-03-06 05:23:07

1

@詹姆斯麥克奈利斯已經指出了基本問題。我的建議是:

  1. 請勿使用getline的成員函數格式。
  2. 不要在同一語句中混合使用getline>>
  3. 使用循環。
0

我發現其他C++ getline更簡單,更安全;

string str; 
getline (cin,str); 

會發出聲音的整條生產線,並把它變成一個字符串,你可以通過許多精美的字符串方法接着玩,或者,如果你想要做的字符串的部分I/O的stringstream。

+0

通常這就是我會做的,但不幸的是,我不得不爲這個項目使用C風格的字符串。 – user646651 2011-03-06 05:23:16

相關問題