2012-03-20 85 views
2

我上的Visual C++ 2010cin.getline设置开始字符串的“ 0”

char c[10]; 
cin.get(&c[0],5); 
cin.get(&c[2],4); 
cout << c << endl; 

运行此片的代码,如果我喂“123456789”到cin,所述cout子句将打印“ 12567“,这是我预期的结果。

但如果我写:

char c[10]; 
cin.getline(&c[0],5); 
cin.getline(&c[2],4); 
cout<< c <<endl; 

和饲料相同的字符串,它只会告诉我 “12”,其中c == { '1', '2', '\ 0',” 4','\ 0'}

根据documentation,cin.get和cin.getline的区别在于cin.get不会像cin.getline那样丢弃delim字符,所以我不知道为什么会发生。任何人都可以给我提示吗?

+4

您不能使用I/O函数而不检查它们的返回值。 – 2012-03-20 22:49:41

+1

eofbit,badbit等是什么样的? – 01100110 2012-03-20 22:53:25

+0

@ user1200129是的,我检查了三位,“失败位”是真的,但我不知道为什么。 – ziyuang 2012-03-20 23:17:31

回答

4

发生了什么事情是,如果basic_iostream::getline()达到要读取的字符数限制(streamsize参数减1),它会停止读取,然后在它读取的数据之后放置一个空字符。它还在流上设置failbit

所以假设流具有"123456789"准备好读,当你调用cin.get(&c[0],5)阵列将得到{'1','2','3','4','\0'}通过4放入元素0。并且在流上设置了failbit

现在,当您拨打cin.get(&c[2],4)时,failbit已在流上设置,因此不会读取任何内容。 getline()调用除了在索引2处将终止空值放入数组(即使没有从流中读取任何数据,getline()将放置空字符 - 即使非读取是因为failbit)。所以数组现在看起来像:

{'1','2','\0','4','\0'} 

您链接到文档中提到这一点:

如果函数停止读取,因为达到这个尺寸,failbit内部标志设置。

getline()做了很多,所以很容易错过这个细节。

+0

谢谢@MichaelBurr我现在明白了逻辑。 'streamsize'参数具有缓冲区大小的默认含义。一旦达到,就不应再读取任何内容,程序员必须先处理该情况。 – ziyuang 2012-03-21 00:50:45