我有一个简单的程序,它试图将二维数据读入堆分配的浮点数组中。该计划如下。
#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个零)。
数据似乎是制表符分隔符;是问题还是我的方法完全无效?
答案 0 :(得分: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];
}