【问题标题】:Populating an array from a .txt file从 .txt 文件填充数组
【发布时间】:2018-12-05 14:57:24
【问题描述】:

我正在尝试从我正在阅读的 .txt 中填充一个数组。我正在使用此代码作为读取文件的函数:

double* read_text(const char *fileName, int sizeR, int sizeC)
{
    double* data = new double[sizeR*sizeC];
    int i = 0;
    ifstream myfile(fileName);
    if (myfile.is_open())
    {

        while (myfile.good())
        {
            if (i > sizeR*sizeC - 1) break;
            myfile >> *(data + i);
            //cout << *(data + i) << ' '; // Displays converted data.
            i++;
        }
        myfile.close();
    }

    else cout << "Unable to open file";
    //cout << i;

    return data;
}

现在,当我读取文件时,我试图从 1D 数据数组中获取元素并将它们存储到 2D 数组中。

我尝试在公共类中创建一个数组,但是我不知道如何将我正在读取的数据移动到二维数组。

我知道这不是很清楚,但基本上我正在使用最近邻搜索算法来比较 2 张图像。我已经拍摄了一张图像并使用上面的这段代码将其转换为值。但是现在我正在尝试将正在读取的数据存储到 2D 公共数组中?

【问题讨论】:

  • 我不明白。已经有大量关于读取二维数组的示例和问题。在网上搜索“C++ 读取文件矩阵”或“c++ 读取文件二维数组”。
  • while (myfile.good())while (!myfile.eof())you should not not do that几乎一样。
  • 你为什么要这样做? 1D 阵列比任何 2D 恶作剧都要好得多。您不能只重新映射索引以访问您已经拥有的一维数组吗?
  • @Someprogrammerdude 在这种情况下,没关系。尝试最终读取后没有完成任何“工作”,因此在正确的时间评估条件。我同意重新安排循环可以产生更多惯用的代码。
  • 所以这里没有答案。通过返回一维数组,您正在做正确的事情。不要改变那个。这样更好。

标签: c++ arrays approximate-nn-searching


【解决方案1】:

这里是二维矩阵读取的更简洁版本:

int quantity = sizeR * sizeC;
double * matrix = new double [quantity];
double value = 0.0;
double * p_cell = matrix;
//...
while ((myfile >> value) && (quantity > 0))
{
  *p_cell++ = value;
  --quantity;
}

在上面的代码sn-p中,使用了一个指针来指向矩阵(二维数组)的下一个槽或单元。每次读取后指针递增。

quantity 被递减作为安全检查以防止缓冲区溢出。

【讨论】:

    【解决方案2】:

    假设每个返回的 double 代表一个像素。您可以定义一个检索像素的函数,如下所示:

    double get_pixel(int x, int y, double* data, int sizeC)
    {
        return data[x + y*sizeC];
    }
    

    其中sizeC 是图像的宽度(列数)。

    然后您可以使用上面的函数来填充您的二维数组,如下所示:

    for(int i = 0; i < sizeC; i++)
        for(int j = 0; j < sizeR; j++)
            my2Darray[i][j] = get_pixel(i, j, data, sizeC);
    

    但是请注意这是多么不必要。你真的不需要二维数组 :) 保持简单和高效。

    上面的函数可以是一个结构体的一部分,它代表你将 sizeC、sizeR 和数据定义为成员的 Image。

    struct Image
    {
        int sizeC;
        int sizeR;
        double* data;
    
        get_pixel(int x, int y)
        {
            return data[x + y*sizeC];
        }
    };
    

    然后,您可以简单地访问图像像素:

    Image img;
    // read image data and stuff
    double p = img.get_pixel(4, 2);
    

    您甚至可以通过覆盖 operator() 而不是 get_pixel 来使它看起来更漂亮,因此检索像素看起来像这样:

    double p = img(4, 2);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-05
      相关资源
      最近更新 更多