用文本文件C++更快地初始化数组

Faster way to initialize array with text file C++

本文关键字:初始化 数组 文本 文件 C++      更新时间:2023-10-16

所以我有一个相当大的文本文件,其中有两列数字,我希望能够在我正在编写的程序中使用它作为二维数组。这是每次启动程序时都需要访问的数据,我觉得每次启动程序都必须用文件读取器读取数据太慢/效率太低。

因此,我想知道是否有一种更简单/更有效的方式来访问数据,而不必以传统方式读取数据(ifstream等)?我相信我曾经见过这样的事情:

float array[]{
    #include "myfile.txt"
}

但我甚至不确定这样做是否有效,而且我找不到任何相关信息。

首先,您必须考虑如何声明和初始化二维数组。仅仅

int x[5][2] = {
    {1, 1},     
    {2, 2},     
    {3, 3},     
    {4, 4},     
    {5, 5}
};

如果数组元素来自文件,则必须像创建文件一样创建;在CCD_ 1中;

{1, 1},     
{2, 2},     
{3, 3},     
{4, 4},     
{5, 5}

遵循C++include文件预处理器指令的规则,您可以简单地编写这样的代码;Source.cpp文件;

#include <iostream>
using namespace std;
int x[5][2] = {
    #include "file.txt"
};
int main(int argc, char* argv[])
{   
    for(int i = 0; i < 5; ++i)
    {
        for(int j = 0; j < 2; j++)          
        {
            cout << "x[" << i + 1 << "][" << j + 1 << "] = " << x[i][j] << " , ";
        }
        cout << endl;
    }
    return 0;
}

如果你坚持在包含的文件中嵌入数据的方式,你可以使用Macros:

  1. 将数据写入包含的文件中(示例中为"myfile.txt"或"myfile.h")
  2. 以以下格式写入数据:

    #define DATA 1,2,3,4,5
    

    (您可以将其分成几行,但保持逗号分隔的格式)。

  3. 在源文件的顶部包含"myfile.h"。

  4. 使用DATA而不是#include语句:

    float array[] {
        DATA
    };
    

要实现这一点,您应该按照C++语法格式化文本文件。您可以遵循许多教程,以便看到这方面的好例子以及正在发生的事情的描述。

下面是一个简短的例子:

  • 对于一维数组,只需键入带有逗号的数字,如下所示

1.0, 3.4, 3.14, 5.56

  • 对于两个或两个以上的维度,将每一行括在大括号{}中,用彗形分隔每一列,如下所示

{1.0, 3.14}, {4.1, 5.674}

以上是假设您正在遵循自己的示例

float array[] = {
    #include "textFile.txt"
};

如果您不介意在数据更改时重新编译,那么您的做法是正确的。当然,数据必须有逗号,因为它必须是有效的C/C++语法。#include所做的就是将文件的内容粘贴到源代码中。

OTOH,如果你介意在数据更改时重新编译,那么你需要在程序启动时动态分配内存并解析数据文件。这里你需要克服的问题是,你不一定事先知道数组有多大,如果你使用动态扩展的数组,随着数组的增长,你可能会在内存分配和删除方面浪费相当多的时间。和往常一样,我的解决方案是违反直觉的。我只读取了两次文件,一次是计算其中有多少数字,然后分配内存,然后再次读取文件,将数字解析到内存中。(如果读一次不需要很长时间,那么读两次也不需要,尤其是因为它已经在系统缓存中了。)

你说数据是二维的,但你可以把它作为一维放在数组中,然后只在二维访问它,就像这样:

#define A(row,col) array[(row)*2 + (col)]