C++ 在C+中编译时从CSV创建向量+;

C++ 在C+中编译时从CSV创建向量+;,c++,csv,C++,Csv,我正在尝试为我的Xilinx Zynq SoC(手臂皮层)创建一个查找表 我有一个包含1330个条目的CSV文件,在运行时我无法读取或解析这些条目。我能做的最新工作是在编译时。我读过,可以将文件嵌入可执行文件中,以便在运行时使用 换句话说,我希望在运行时读取和解析CSV文件,而不是将原始文件放在任何文件系统上,因为它是一个嵌入式设备。因此,我需要以某种方式将CSV文件嵌入到可执行文件中。我怎样才能做到这一点 CSV文件如下所示(完整文件为) 你要求一个向量,但我不知道你为什么一定要这个。数据将不

我正在尝试为我的Xilinx Zynq SoC(手臂皮层)创建一个查找表

我有一个包含1330个条目的CSV文件,在运行时我无法读取或解析这些条目。我能做的最新工作是在编译时。我读过,可以将文件嵌入可执行文件中,以便在运行时使用

换句话说,我希望在运行时读取和解析CSV文件,而不是将原始文件放在任何文件系统上,因为它是一个嵌入式设备。因此,我需要以某种方式将CSV文件嵌入到可执行文件中。我怎样才能做到这一点

CSV文件如下所示(完整文件为)


你要求一个
向量,但我不知道你为什么一定要这个。数据将不可避免地占用应用程序的只读(“.text”或“.rodata”或类似内容)部分的空间,而如果需要,您可以将其转换为
向量
(这将消耗堆空间,并需要从只读.text/.rodata部分的数据进行运行时构造和初始化),您也可以将其用作一个示例,因为我怀疑您是否会在运行时更改数据。所以,要创建一个
const
POD数据数组,您可以这样做

const int myArray[] =
{
    #include "myCsvFile.csv"
};
如果元素的数量不是固定的,您的程序可以使用
sizeof(myArray)/sizeof(myArray[0])
确定元素的数量。即使它是一个固定的大小,这种技术可能是最好的反正。当然,如果您的所有条目都是无符号的,并且可以容纳在16位以内(粗略检查建议这样做),那么您可以将其定义为
无符号短
uint16_t
的数组以节省空间,而不是将其定义为
无符号短


我还应该提到,
const
关键字在这里很重要:没有它,数组将占用两倍的内存:首先,它将占用只读部分(.text或.rodata或其他内容)中的空间,以及在应用程序初始化期间,运行时将在读/写数据节(.data)中创建只读数据的读/写副本,其中分配了
myArray
。为了避免这种情况,请将其定义为
const
,然后
myArray
的地址将位于只读部分,并且不会复制到读/写数据部分。

您要求提供一个
向量,但我不确定您为什么需要它。数据将不可避免地占用应用程序的只读(“.text”或“.rodata”或类似内容)部分的空间,而如果需要,您可以将其转换为
向量
(这将消耗堆空间,并需要从只读.text/.rodata部分的数据进行运行时构造和初始化),您也可以将其用作一个示例,因为我怀疑您是否会在运行时更改数据。所以,要创建一个
const
POD数据数组,您可以这样做

const int myArray[] =
{
    #include "myCsvFile.csv"
};
如果元素的数量不是固定的,您的程序可以使用
sizeof(myArray)/sizeof(myArray[0])
确定元素的数量。即使它是一个固定的大小,这种技术可能是最好的反正。当然,如果您的所有条目都是无符号的,并且可以容纳在16位以内(粗略检查建议这样做),那么您可以将其定义为
无符号短
uint16_t
的数组以节省空间,而不是将其定义为
无符号短


我还应该提到,
const
关键字在这里很重要:没有它,数组将占用两倍的内存:首先,它将占用只读部分(.text或.rodata或其他内容)中的空间,以及在应用程序初始化期间,运行时将在读/写数据节(.data)中创建只读数据的读/写副本,其中分配了
myArray
。为了避免这种情况,请将其定义为
const
,然后
myArray
的地址将位于只读部分,并且不会复制到读/写数据部分。

因为您的数据是无符号整数的普通数组,所以可以使用预编译器

假设您的csv文件位于
data.csv
文件中

然后,只需在.cpp文件中,您就可以执行以下操作:

const unsigned int k_Data[] = {
#include "data.csv" // << Preprocessor will replace this line with the contents of data.csv
};

#include <iostream>

int main()
{
    std::cout << k_Data[3];
}
const unsigned int k_Data[]={

#包括“data.csv”/,因为您的数据是一个无符号整数的普通数组,您可以使用预编译器

假设您的csv文件位于
data.csv
文件中

然后,只需在.cpp文件中,您就可以执行以下操作:

const unsigned int k_Data[] = {
#include "data.csv" // << Preprocessor will replace this line with the contents of data.csv
};

#include <iostream>

int main()
{
    std::cout << k_Data[3];
}
const unsigned int k\u Data[]={

#针对您拥有的特定类型的csv数据,包括“data.csv”/,例如

0,0,48,112,160,208,272,320,368,432,480,512,576,640,704,752,800,848,896,......
这基本上只是一组数字,您应该能够使用实际的
#include
语句包含它们,所以

const unsigned short myCSV[] ={
#include "./theCSV.data"
};

Im使用的是
unsigned short
,因为最大的数字看起来像64k,这会为您节省一些空间——但您可能希望使用
int
,如果您认为对于您拥有的特定类型的CSV数据,该数字可以大于64k

,例如

0,0,48,112,160,208,272,320,368,432,480,512,576,640,704,752,800,848,896,......
这基本上只是一组数字,您应该能够使用实际的
#include
语句包含它们,所以

const unsigned short myCSV[] ={
#include "./theCSV.data"
};

我使用的是
unsigned short
,因为最大的数字看起来像64k,这会为您节省一些空间——但您可能需要使用
int
,如果您认为该数字可以大于64k,请显示csv的示例以及您是如何使用它的。@teivaz我已经添加了一个指向csv的链接。我需要找到一种方法来获取所有的csvl数组中的这些值并在运行时可用。有什么原因不能将其作为数组编译到代码中吗?@Soren我不知道这是可能的。请显示csv的示例以及如何使用它。@teivaz我添加了一个指向csv的链接。我需要找出一种方法来获取数组中的所有值并将其保存在运行时可用。有什么原因不能将其编译成c语言吗