我正在尝试读入,然后输出三行文本文件的内容,如下所示:
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,但不适用于多行。但是练习涉及多行,所以我有点迷失。
答案 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。
默认情况下,提取运算符会截断所有空格。它还返回一个布尔值,指示操作是否成功。