【问题标题】:Reading 2-dimensional table to array将二维表读入数组
【发布时间】:2016-12-30 10:02:01
【问题描述】:

我有一个简单的程序,它试图将二维数据读入堆分配的浮点数组。程序如下。

#include <iostream>
#include <fstream>


void read_file(std::ifstream &inFile,  float **arr, unsigned m, unsigned n)
{

    for(unsigned i = 0; i < m; ++i) {
        for(unsigned j = 0; j < n; ++j) {
            inFile >> arr[i][j];
            std::cout << arr[i][j];
        }
        std::cout << std::endl;
    }

}


int main() {

    const unsigned m = 20;
    const unsigned n = 1660;

    float **A = new float *[m]; // alloc pointers to rows 1,...,m
    for(unsigned row = 0; row < m; row++) A[row] = new float [n]; // alloc columns for each row pointer

    std::ifstream inFile("data.dat");
    read_file(inFile, A, m, n);



    // DEALLOC MEMORY
    for(unsigned row = 0; row < m; row++) delete [] A[row]; // dealloc columns for each row pointer
    delete [] A; // dealloc row pointers


    return EXIT_SUCCESS;
}

数据是一个包含 0-1 个条目的表格(参见此处:data),它很好地面向行,有 20 行和 1660 列。我将打印添加到 read_file 函数中以查看出现了什么问题,它只打印零,但至少打印正确的数量(20*1660 个零)。

数据似乎是制表符分隔的;这是问题还是我的方法完全无效?

【问题讨论】:

  • 有趣的是你如何包含 vector 而你却不使用它!
  • 我从vector 开始,但后来我尝试了解new 关键字。
  • 这里有一个很好的C++ books 列表。我建议你看看它。对于 2D 数组,使用向量的向量。
  • 你应该检查文件是否存在。

标签: c++ file io ifstream


【解决方案1】:

这正是文件不存在时可能发生的情况。

您应该在创建inFile 对象后检查文件是否存在,例如:

std::ifstream inFile("data.dat");
if (!inFile)
{
   std::cerr << "cannot open input" << std::endl;
   return 1;
}

如果文件不存在,cin 不会将数据放入您的数组中,并且您有可能一路得到 0(我有 0 + 其他奇怪的东西),所以总结一下 未定义的行为

请注意,如果文件存在,您的程序将按预期运行。 读取一个值后检查文件会更好,以确保该文件具有与预期一样多的值:

for(unsigned j = 0; j < n; ++j) {
    inFile >> arr[i][j];
    if (!inFile)
    {
        std::cerr << "file truncated " << i << " " << j << std::endl;
        return;
    }
    std::cout << arr[i][j];
}

【讨论】:

  • 谢谢琼。你是对的,我需要为我的 IDE 指定工作目录,现在它可以工作了!
猜你喜欢
  • 2015-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-06
  • 2014-09-13
相关资源
最近更新 更多