首页 文章

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

提问于
浏览
5

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

鲍勃迪伦10 9

约翰列侬8 7

大卫鲍伊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 回答

  • 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;
    }
    

    编辑:回答你的问题:

    How does getline() work?
    读取整行直到'\n'字符或指定的分隔字符 . http://www.cplusplus.com/reference/string/string/getline/?kw=getline

    读取该行后,控件转到文件中的下一行 .
    此外,如果读取操作成功,则返回布尔值true,否则返回false .

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

相关问题