gpt4 book ai didi

c++ - 读取二维表到数组

转载 作者:行者123 更新时间:2023-11-28 05:21:34 25 4
gpt4 key购买 nike

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

#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 个零)。

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

最佳答案

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

您应该在创建 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];
}

关于c++ - 读取二维表到数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41394250/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com