【问题标题】:Why is getline not moving to next line?为什么 getline 不移动到下一行?
【发布时间】:2018-07-02 18:17:29
【问题描述】:

所以我无法弄清楚为什么我的 getline 循环在处理完第一行后不会移动到下一行。这段代码的目标是获取一个看起来像这样的文本文件:

a 22.55736 110.9237 10.0 9.0 8.0 -1.0 1.0 -1.0 5.0 6.0 11.0
b 40.5567 50.556 10.0 9.0 8.0 -1.0 1.0 -1.0 5.0 6.0 11.0
c 26.7798223 24.5 10.0 9.0 8.0 -1.0 1.0 -1.0 5.0 6.0 11.0

逐行阅读,将(由空格分隔的)元素复制到单个变量中以供将来使用。为了检查标记化,我将变量逐行输出到 output.txt 文件中,以确保代码正常工作。代码如下:

#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <sstream>
#include <string>
#include <vector>
#include <iterator>
#include <algorithm>

using namespace std;

int main() {

    string stringLine;
    ifstream inFile;
    inFile.open("missionData.txt");
    ofstream outputFile;
    outputFile.open("outputFile.txt");

    if (inFile.good())
    {
        while (getline(inFile, stringLine))
        {

            //getline(inFile, stringLine);  //Read line from txt into stringLine
            istringstream iss(stringLine);
            vector<string> lineArray{ istream_iterator<string>{iss},
                                            istream_iterator<string>{} };

            //Convert tokenized vector into individual, usable parameters
            const char* funcType = lineArray.at(0).c_str();
            double lat = atof(lineArray.at(1).c_str());
            double lon = atof(lineArray.at(2).c_str());
            float alt = stof(lineArray.at(3));
            float speed = stof(lineArray.at(4));
            float radius = stof(lineArray.at(5));
            float yaw = stof(lineArray.at(6));
            float duration = stof(lineArray.at(7));
            float imgOn = stof(lineArray.at(8));
            float vidOn = stof(lineArray.at(9));
            float micOn = stof(lineArray.at(10));
            float sensOn = stof(lineArray.at(11));

            int i = 0;
            while (i < 12)
            {
                outputFile << funcType << endl;
                outputFile << lat << endl;
                outputFile << lon << endl;
                outputFile << alt << endl;
                outputFile << speed << endl;
                outputFile << radius << endl;
                outputFile << yaw << endl;
                outputFile << duration << endl;
                outputFile << imgOn << endl;
                outputFile << vidOn << endl;
                outputFile << micOn << endl;
                outputFile << sensOn << endl;
            }
        }
        inFile.close();
    }
    return 0;
}

理想情况下,输出文件将显示输入文件的 3 行中的每个元素,每行一个元素,停止一次 .good 返回 false(到达 eof)。结果我很好地分离了元素,但是查看输出文件显示第一行一遍又一遍地重复,每行一个元素(应该是这样)。好像 getline 卡在输入文件的第一行,无法前进。知道发生了什么吗?谢谢!

【问题讨论】:

  • 一些关于风格的cmets。 ifstream inFile; inFile.open("missionData.txt"); 应该是 ifstream inFile("missionData.txt");if (inFile.good()) while (getline()) 不需要 if 部分:如果 inFile 不好,对 getline 的调用将失败。并且不需要调用inFile.close();;析构函数将关闭文件。

标签: c++ vector iostream ifstream getline


【解决方案1】:
int i = 0;
while (i < 12)
{
    outputFile << funcType << endl;
    outputFile << lat << endl;
    // ...
}

这是一个无限循环,因为您永远不会更改 i 的值。所以getline 永远不会读取第二行,因为getline 永远不会被第二次调用——在此之前代码会陷入无限循环。

PS:即使你修复它迭代 12 次,就像你想的那样,我仍然想知道打印 12 次相同的信息的目的是什么。

【讨论】:

  • Aaa 就是这样,谢谢!我记得我对自己想“一旦你完成了输出行,一定要添加一个 i++”,但当然,我从来没有考虑过。为了回答您的问题,打印到输出文件只是我检查我的标记化方法是否有效的一种方式。实际上,这 12 个变量将被传递给不同的函数。
  • @W.Nash 我的问题不是为什么要打印出十二个变量,而是为什么要尝试将它们打印出 12 次。在我看来,您只需要 12 个打印语句,而无需围绕它们进行循环。
  • 是的,我刚刚明白你的意思,我想这只是漫长的一天哈哈。感谢您的提醒!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-11
  • 1970-01-01
  • 2017-11-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多