使用getline()从文件中读取多行

时间:2013-12-24 07:47:33

标签: c++ file-io getline

我正在尝试读入,然后输出三行文本文件的内容,如下所示:

Bob Dylan 10 9

John Lennon 8 7

David Bowie 6 5

对于每一行,我只想输出该行,即firstName LastName number1 number2。

我正在使用以下代码:

int num1;
int num2;
string firstName;
string lastName;
string fullName; 
ifstream inFile;

inFile.open("inputFile.txt");

while (getline(inFile, firstName))
    {
        inFile >> firstName >> lastName >> num1 >> num2;

        fullName = firstName + " " + lastName;

        cout << fullName << " " << num1 << " " << num2 << endl;
    }

inFile.close();

此输出有2个问题。首先,第一行不输出,虽然从实验中我知道它已读入。其次,在读入并输出最后两行(根据需要)后,程序显示最后一行中的所有内容除了名字外(在这种情况下,它打印的最后一件事是Bowie 6 5)。

有人可以使用这个简单的例子来解释当从文件中读取多行时getline函数的工作原理吗? (我甚至不知道这是不是最好的方式,但这是我所知道的唯一方式)。以下是一些具体问题。

首先,while循环条件getline(inFile,firstName)是否返回一个布尔值?如果是这样,如果我没有给firstName一个值,它怎么可能是真的(即while循环如何开始)?如果程序读取第一行并且是否存在某些内容,那么它会执行while循环,但是从第二行开始,因为它已经使用了第一行检查内容?

其次,如果firstName确实有一个值,并且该值是第一行的第一个名称(在本例中为“Bob”),为什么不是第一行输出呢?我一直绞尽脑汁想弄清楚它到底去了什么。

第三,在程序读入并显示最后两行之后,程序移动到下一行并且只遇到空白,对吧?那么firstName的值是多少?它会是空白,还是仍然是“大卫”?如果它是空白的,为什么while循环再次执行?但如果它是“大卫”,那么为什么该程序不能与其他人一起输出该值?

顺便说一下,我正在编写一本教科书(不是作业),它涵盖了getline,但不适用于多行。但是练习涉及多行,所以我有点迷失。

1 个答案:

答案 0 :(得分:7)

您正尝试两次读取每一行。

while (getline(inFile, firstName)) // reads the line
    {
        // reads the next line and overwrites firstName!
        inFile >> firstName >> lastName >> num1 >> num2;

将其更改为:

while ( inFile >> firstName >> lastName >> num1 >> num2 )
{
    fullName = firstName + " " + lastName;
    cout << fullName << " " << num1 << " " << num2 << endl;
}

编辑:回答你的问题:

getline()如何运作?
将整行读取到'\ n'字符或指定的分隔字符。 http://www.cplusplus.com/reference/string/string/getline/?kw=getline

读完该行后,控件进入文件的下一行 此外,如果读取操作成功,则返回布尔值true,否则返回false。

默认情况下,提取运算符会截断所有空格。它还返回一个布尔值,指示操作是否成功。