从字符串转换为float时文件中的第一行元素丢失

时间:2019-02-16 21:28:53

标签: c++ vector readfile

我有以下问题,但我不知道为什么以及如何发生。

这是我的文件

###########################
###########################
POINTS
68.252 87.2389 -50.1819
68.2592 87.2451 -50.2132
68.2602 87.2436 -50.2133
68.2564 87.2333 -50.1817
68.2618 87.2475 -50.244
68.2476 87.2446 -50.182
68.2582 87.2466 -50.2131
68.2618 87.2475 -50.244
67.9251 87.2509 -49.8313
67.9311 87.2511 -49.8443
67.9786 87.196 -49.8365
67.9735 87.1946 -49.8231
67.9383 87.2513 -49.8574
67.9848 87.1975 -49.8499
68.0704 87.0819 -49.8067
68.0778 87.09 -49.8349
68.0002 87.2009 -49.8769
68.088 87.1 -49.8633
68.1689 86.9755 -49.8051
68.1709 86.9825 -49.8199
68.1672 86.9693 -49.7903
68.2164 86.9204 -49.7972
68.2157 86.913 -49.7821
...
END
##############################
TRIANGLES
...

我想要的是读取文件的每一行。在空格上分割并将字符串转换为浮点数。这就是我的做法:

#include "pch.h"
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <sstream>

using namespace std;

int main()
{
    string line;

    ifstream inFile;
    string path = "C:\\...";
    inFile.open(path);

    if (!inFile)
    {
        cerr << "Unable to the open file.";
        exit(1);
    }

读取文件的基本步骤

    int vc_size = numOfPoints(inFile); // A function I implemented to get the number of points

    vector<float> my_coordinates(vc_size);

    int current_pos = 0;

初始化一些变量

    while (getline(inFile, line))
    {
        if (line == "POINTS")
        {
            while (getline(inFile, line, ' '))
            {
                if (line == "END" || current_pos >= vc_size)
                    break;

                my_coordinates[current_pos] = atof(line.c_str());

                current_pos++;
            }
        }
    }

    inFile.close();

    for (size_t i = 0; i < vc_size; ++i)
        cout << my_coordinates[i] << endl;

    return 0;
}

即使这看起来合乎逻辑,我还是有一个大问题。 我所有行的第一个值(第一个除外)都消失了(意味着所有68.something都不在我的输出中)。 而且更令人困惑的是,如果我将vector设为vector<string>并执行x_coordinates[current_pos] = line;,那么代码就会起作用。 这对我没有任何意义,因为更改的唯一步骤是从stringfloat的转换(我尝试使用stringstream进行转换,但结果相同)。

1 个答案:

答案 0 :(得分:1)

问题在于您的代码仅将空格作为数字的分隔符,但实际上您将空格和换行符作为分隔符。

将您的内部循环更改为此,以便其处理所有空白

        string item;
        while (inFile >> item)
        {
            if (item == "END" || current_pos >= vc_size)
                break;

            x_coordinates[current_pos] = atof(item.c_str());

            current_pos++;
        }