gpt4 book ai didi

c++ - 如何在 C/C++ 中读取未知维度的数据文件

转载 作者:太空狗 更新时间:2023-10-29 23:22:38 25 4
gpt4 key购买 nike

我有一个数据文件,其中包含行/列形式的数据。我想要一种方法将这些数据读入 C 或 C++ 中的二维数组(以更容易的为准),但在我开始读入之前我不知道文件可能有多少行或列。

文件的顶部是一个注释行,给出了一系列与每列包含的内容相关的数字。每行都保存了每个数字在某个时间点的数据,因此示例数据文件(一个小文件 - 我使用的文件大得多!)可能是这样的:

# 1 4 6 28
21.2 492.1 58201.5 586.2
182.4 1284.2 12059. 28195.2
.....

我目前正在使用 Python 使用 numpy.loadtxt 读取数据,无论数据数组大小如何,它都可以方便地将数据拆分为行/列形式,但这变得非常慢。我希望能够在 C 或 C++ 中可靠地做到这一点。

我可以看到一些选项:

  1. 使用我的提取程序中的维度添加标题标签

    # 1 4 6 28
    # xdim, ydim
    21.2 492.1 58201.5 586.2
    182.4 1284.2 12059. 28195.2
    .....

    但这需要重写我的提取程序和使用提取数据的程序,这是相当密集的。

  2. 将数据存储在数据库文件中,例如。 MySQL、SQLite等。然后可以按需提取数据。这可能是开发过程中的一项要求,因此无论如何都要研究一下。

  3. 使用 Python 读入数据并封装 C 代码进行分析。这在短期内可能是最简单的。

  4. 在 linux 上使用 wc 查找标题中的行数和单词数以查找维度。

    echo $((`cat FILE | wc -l` - 1)) # get number of rows (-1 for header line)
    echo $((`cat FILE | head -n 1 | wc -w` - 1)) # get number of columns (-1 for '#' character)
  5. 使用C/C++代码

这个问题主要与第 5 点有关 - 如果在 C/C++ 中有一种简单且可靠的方法来做到这一点。否则欢迎任何其他建议

谢谢

最佳答案

创建表作为 vector 的 vector :

std::vector<std::vector<double> > table;

内部无限(while(true))循环:

读取行:

std::string line;
std::getline(ifs, line);

如果出现问题(可能是 EOF),退出循环:

if(!ifs) 
break;

如果是评论,请跳过该行:

if(line[0] == '#')
continue;

将行内容读入 vector :

std::vector<double> row;
std::copy(std::istream_iterator<double>(ifs),
std::istream_iterator<double>(),
std::back_inserter(row));

向表中添加行;

table.push_back(row);

在您退出循环时,“表”包含数据:

  • table.size()是行数

  • table[i] 是第 i 行

  • table[i].size() 是列数。在第 i 行

  • table[i][j] 是第 j 列的元素。第 i 行

关于c++ - 如何在 C/C++ 中读取未知维度的数据文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2221065/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com