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

标签 c++ file-io getline

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

鲍勃迪伦 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) 是否返回 bool 值?如果是这样,如果我还没有给 firstName 一个值,它怎么可能是真的(即 while 循环如何开始)?是不是程序读取第一行,如果那里有东西,那么它会执行 while 循环,但从第二行开始,因为它已经使用第一行来检查内容?

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

第三,程序读入并显示最后两行后,程序移动到下一行,只遇到空白,对吗?那么 firstName 的值是多少?它会是空白的,还是仍然是“David”?如果是空白,为什么while循环又执行了一次?但如果它是“David”,那么为什么程序不将那个值与其他值一起输出呢?

顺便说一句,我正在研究一本教科书(不是为了家庭作业),它涵盖了 getline,但不包括多行。但是后来练习涉及多行,所以我有点迷路了。

最佳答案

您正在尝试将每一行阅读两次。

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

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

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

关于c++ - 使用 getline() 从文件中读取多行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20756968/

相关文章:

python - 可以在循环内多次使用 getline() 吗? - Cython,文件读取

c++ - 使用 getline 读取文件时遇到问题(菜鸟)

c++ - 为什么子类的子类不能访问其祖先的 protected 成员?

c++ - 将短裤数组写入文件

c++ - 使用某个宏时如何禁止调用特定函数

java - 同步和IO文件

c++ - 在 C/C++ 中,我想多次写入同一个管道

c++ - cin.ignore()为什么忽略getline输入的第一个字符?

c++ - 为什么 Qt 应用程序不给我异常或错误?

c++11 线程与 .Net 线程?