如何将数据存储在二维向量中?

Posted

技术标签:

【中文标题】如何将数据存储在二维向量中?【英文标题】:How can i store data in a 2d vector? 【发布时间】:2021-09-16 11:37:42 【问题描述】:

我有一段代码,我在其中读取一个 CSV 文件并打印它的内容。现在的问题是我想在 ESP32 上运行我的代码,并且由于 micropython 的一些限制,我无法将我的文件上传到 spiffs 存储中。那么有什么方法可以将 csv 文件内容存储在代码本身中,而不是从外部读取呢?

我的代码:

vector<vector<double> > read_csv(const char *filename)

    ifstream read_file(filename);
    vector<vector<double> > csv_data;
    std::string lineStr;
    while (getline(read_file, lineStr))
    
        stringstream ss(lineStr);
        std::string d;
        vector<double> a_line_data;
        while (getline(ss, d, ','))
        
            a_line_data.push_back(atof(d.c_str()));
        
        csv_data.push_back(a_line_data);
    
  //cout << csv_data << endl;
    return csv_data;

这就是我打印内容的方式:

 vector<vector<double> > csv_data = read_csv("A00068.csv");
  // print tests 
  printf("CSV:%d\n", csv_data);
  printf("SIZE:%d\n", csv_data.size());
  

【问题讨论】:

您的存储似乎正确,但您的打印肯定不正确。 您想硬编码这些值而不是从文件中读取? std::vector&lt;std::vector&lt;double&gt;&gt; csv_data 0.2,....,...., ...;. @463035818_is_not_a_number 可能有一个正则表达式可以进行这种转换;) 抛开所有的玩笑,您最好只阅读文件。阅读看起来不错,虽然我会使用 std::stof 它可以直接转换 std::strings 。我会使用基于范围的 for 循环和 cout 来输出向量的内容。 @PKramer 可能有任何东西的正则表达式,但这太真实了:xkcd.com/1171 【参考方案1】:

最明显的可能性是......

直接在代码中硬编码值:

std::vector<std::vector<double>> csv_data  0.2,....,...., ...;

另一种可能性是将文本文件包含为字符串。有关详细信息,请参阅此答案:https://***.com/a/25021520/4117728。您基本上会在文件的开头添加一些标记,最后,链接的答案表明:

R"=====( 0.2, 0.1, ... your numbers
     ... more numbers...
0.42, 3.141)====="

然后像这样包含文件:

std::string csv_contents =
#include "test.txt"
;

现在您有了一个需要解析的字符串,就像之前解析文件内容一样。因此,唯一的好处是现在您的数据可以嵌入到可执行文件中,而不是放在单独的文件中。如果您担心进行解析的成本,那么您可以考虑首先提到的替代方案。

【讨论】:

谢谢我以这种方式存储值 std::vector<:vector>> csv_data 0.2,....,...., ... ;一切都很好。

以上是关于如何将数据存储在二维向量中?的主要内容,如果未能解决你的问题,请参考以下文章

C++ 中 boost::variant 的二维向量

C++中向量的向量顺序

如何将数据存储在动态二维数组中,该数组在 C++ 中的另一个结构中也使用的结构中声明

C语言 二维数组的线性存储特性

C语言 二维数组的线性存储特性

如何通过C ++中的数据获得向量的索引