C++每次读取一行字符串输入

C++的istream中的类(如cin)提供了一些面向行的类成员函数:getlinr()和get()。这两个函数都读取一行输入,直到到达换行符。然而,随后getline()将丢弃换行符,而get()将换行符保留在输入队列中。

1.getline()

getline()函数读取整行,它使用通过回车键输入的换行符来确定输入结尾。要调用这种方法,可以使用cin.getline()。该函数有两个参数。第一个参数是用来存储输入行的数组名称,第二个参数是要读取的字符数如果这个参数为20,则函数最多读取19个字符,余下的空间用于存储自动在结尾处添加的空字符。getline()成员函数在读取指定数目的字符或遇到换行符时停止读取。

例如,假设要使用getline()将姓名读入到一个包含20个元素的name数组中,可以用这样的函数调用:

cin.getline(name,20);

这将一行读入到name数组中——如果这行包含的字符不超过19个。

getline()函数每次读取一行。它通过换行符来确定行尾,但不保存换行符。相反,在存储字符串时,它用空字符来替换换行符。

2.get()

istream类有另一个名为get()的成员函数,该函数有几种变体。其中一种变体的工作方式与getline()类似,它们接受的参数相同,解释参数的方式也相同,并且都读取到行尾。但get()并不再读取并丢弃换行符,而是将其留在输入队列中。假设连续两次调用get():

cin.get(name,ArSize);
cin.get(name,ArSize);    //a problem

由于第一次调用后,换行符将留在输入队列中,因此第二次调用时看到的第一个 字符便是换行符。因此get()认为已经到达行尾,而没有发现任何可读取的内容。如果不借助于帮助,get()将不能跨过该换行符。

get()有另一种变体。使用不带任何参数的cin.get()调用可读取下一个字符(即使是换行符),因此可以用它来处理换行符,为读取下一行输入做准备:

cin.get(name,ArSize);   //read first line
cin.get();              //read newline
cin.get(name,ArSize);   //read second line

get()相比于getline()可以使得输入更仔细。例如,假设用get()将一行读入数组。如何知道停止原因是由于已经读取了整行,而不是由于数组已经填满了呢?查看下一个字符,如果是换行符,说明已经读取了整行;否则,说明该行中还有其他输入。

getline()使用起来简单一些,但get()使得检查错误更简单些。

 

注:本文是学习《C++ Primer》的笔记

你可能感兴趣的:(C++,字符串,行)