使用文本文件C ++初始化数组的更快方法

时间:2013-11-27 06:49:07

标签: c++ arrays file optimization multidimensional-array

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

所以我想知道是否有一种更简单/更有效的方式来访问数据而无需以传统方式(ifstream等)读取数据?我相信我曾经见过如下的事情:

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

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

4 个答案:

答案 0 :(得分:2)

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

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

如果来自文件的数组元素必须像exacly那样创建文件; 在file.txt;

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

遵循C ++规则包括文件预处理器指令,您可以像这样编写简单的代码; 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;
}

答案 1 :(得分:0)

为了完成这项工作,您应该以符​​合C ++语法的方式格式化文本文件。您可以按照一些教程进行操作,以便查看相关的示例以及对正在发生的事情的描述。

这是一个简短的例子:

  • 对于一维数组,只需键入带有这样的逗号的数字

1.0, 3.4, 3.14, 5.56

  • 两个或更多维度将每一行括在{}大括号中,用这样的昏迷分隔每一列

{1.0, 3.14}, {4.1, 5.674}

上面假设您正在关注自己的

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

答案 2 :(得分:0)

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

  1. 将您的数据写入包含的文件(示例中的“myfile.txt”或“myfile.h”)。
  2. 以下列格式写入数据:

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

    (你可以把它分成几行,但保持逗号分隔格式。)

  3. 在源文件的顶部添加“myfile.h”。

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

    float array[] {
        DATA
    };
    

答案 3 :(得分:0)

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

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

你说数据是二维的,但是你可以把它作为一维存在于数组中,只需要在两个维度上访问它,如下所示:

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