C ++读取具有不同列长度的数据

时间:2018-04-17 15:33:33

标签: c++

我以前在数据中读取的数据长度都相同,我在这里找到答案。

数据:

0.001    0.001    0
0.001    0.001    0    

代码:

#include <iostream>
#include <fstream>

std::vector<double> heights, times, stdDevs;
std::ifstream data ("inputData.dat");
std::string line;
double var1, var2, var3;

if (data.is_open())
{
    while (getline(data,line))
    {
        std::istringstream(line) >> var1 >> var2 >> var3;
        heights.push_back(var1);
        times.push_back(var2);
        stdDevs.push_back(var3);
    }
}

但是,现在我有不同列长度和更多列的数据。 新数据:

0.001    0.001    0        0.002    0.000    0.001    0    0.002 
         0.001    0.001    0.002    0.001    0.001    0    0.002
         0.002             0.003    0.001    0.002    0    0.003
         0.003             0.005             0.003    0    0.004

我的想法:

  • 我无法在列中添加零以使它们具有相同的大小,因为这会使数据混乱。
  • 我考虑过像以前一样读取数据,除了先找出多少行/列然后创建一个数组来存储所有内容,这样我就可以使用循环代替var1&gt;&gt; var2&gt;&gt;等。
  • 数据不减少,所以我想我可以找到每列的最大值,并使用它来确定每列中的数据长度。

是否所有人都有任何建议,或者我可以获得一些如何阅读如此多的循环列的帮助?感谢。

编辑:我尝试了这个以确定整体尺寸,因为每一栏都以某些内容开头:

if (data.is_open())
{
    getline(data,line);
    for(unsigned int k = 0; k < line.length(); ++k)
    {
        if(!isspace(line[k])){ j++; } //How many columns 
    }

    while (getline(data,line))
    {
        i += 1; //How many rows
    }

现在我要尝试我最大的想法。

1 个答案:

答案 0 :(得分:0)

首先,为了提高效率,最好在一次扫描中完成所有读数。你可以为此组织一个getline()循环。

1)如果第一行定义了整个表的最大列数,则可以读取它以检测此数字并定义正确的数组。

2)你需要决定在没有值的情况下对数组元素放什么。如果所有预期的数字都是>例如,您可以使用-1.0或DBL_MAX。

3)&#34;确定每列中的数据长度&#34; - 你为什么需要这个?假设这些都是双值,你可以在双精度数组的元素中读取它们 - 你不需要临时变量。