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

时间:2016-06-09 17:54:30

标签: c++ csv

我正试图为我的Xilinx Zynq SoC(ARM Cortex)创建一个查找表。

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

换句话说,我想在运行时读取和解析CSV文件,而原始文件实际上不在任何文件系统上,因为它是嵌入式设备。所以我需要以某种方式将CSV文件嵌入到可执行文件中。我将如何实现这样的目标?

CSV文件如下所示(完整文件为Hook to be called when a variable changes);

0,0,48,112,160,208,272,320,368,....,65440,65488

3 个答案:

答案 0 :(得分:2)

您要求vector,但我不确定您为什么一定要这样做。数据将不可避免地占用应用程序的只读(“。text”或“.rodata”或类似内容)部分中的空间,并且如果需要,您可以将其转换为vector(这将占用堆空间)并且需要从只读.text / .rodata部分中的数据进行运行时构造和初始化,你可以将其用作POD array,因为我怀疑你将在运行时更改数据。因此,要创建数据的const POD数组,您可以执行类似的操作....

const int myArray[] =
{
    #include "myCsvFile.csv"
};

如果元素数量未修复,您的程序可以使用sizeof(myArray)/sizeof(myArray[0])确定数字。即使它是一个固定的大小,这种技术无论如何都可能是最好的。当然,如果所有条目都是无符号的并且可以在16位内(粗略检查建议如此),而不是将其定义为int的数组,则可以将其定义为{{1}的数组}或unsigned short以节省空间。

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

答案 1 :(得分:1)

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

假设您的csv文件位于googleapis.com/oauth2/v3/tokeninfo?id_token=TOKEN文件中。

然后只需在.cpp文件中即可:

data.csv
  

112

答案 2 :(得分:1)

对于您拥有的特定类型的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"
};

我正在使用unsigned short,因为最大的数字看起来像是64k而且它可以节省一些空间 - 但是你可能想要使用int代替,如果你相信这个数字可以大于64k < / p>