2011-03-06 140 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

相关问题