[英]Problem reading a file containing decimals
我在试图弄清楚为什么我的文件返回 0 而不是文件中的数字时遇到问题,这是我在 C++ 中读取文件时所做的代码:
#include <cstdlib>
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
string cfile;
int cnum1,cnum2,cnum3,cnum4;
bool fired = false;
/*
*
*/
void printMatrix(double **x, int n)
{
int size = n;
for(int i=0; i<size; i++)
{
for(int j=0; j<size; j++)
{
std:: cout << x[i][j] << " " ;
}
std:: cout << std::endl;
}
}
void readFile(string file,double **x, int n)
{
std::ifstream myfile(file.c_str());
int size = n;
for(int i=0; i<size; i++)
{
for(int j=0; j<size; j++)
{
myfile >> x[i][j];
}
}
}
void GetCommandLineArguments(int argc, char **argv,string &file, int &n, int &k, int &m, int &i)
{
if( argc == 6 )
{
cfile = argv[1];
cnum1 = atoi(argv[2]);
cnum2 = atoi(argv[3]);
cnum3 = atoi(argv[4]);
cnum4 = atoi(argv[5]);
}
file = cfile;
n = cnum1;
k = cnum2;
m = cnum3;
i = cnum4;
}
int main(int argc, char** argv) {
int k; //Factor of n
int m; //Innner matrix size
int i; //Iteration
int n; //Matrix Size
string file;
GetCommandLineArguments(argc, argv, file, n, k, m, i);
double **matrix;
matrix = new double*[n];
for(int i = 0; i<n; i++)
matrix[i] = new double[n];
for(int j=0; j<n; j++)
for(int i=0; i<n;i++)
matrix[i][j] = 0;
readFile(file, matrix, n);
printMatrix(matrix, n);
return 0;
}
这是我的文件示例,其中包含我要从中提取的值:
20.0
20.0
20.0
20.0
20.0
200.0
20.0
200.0
希望有人可以帮助我,因为我研究了一些关于此的信息并没有真正找到解决方案。
您的阅读和打印代码似乎可以正常工作,但您的命令行阅读代码可能存在一些问题。
我在没有得到命令行 arguments 的情况下运行了您的代码。 以下代码几乎是从您的 main 中复制粘贴的减去获取命令行参数。
int main()
{
double **matrix;
std::string file = "test.dat";
int n = 5;
matrix = new double*[n];
for(int i = 0; i<n; i++)
matrix[i] = new double[n];
for(int j=0; j<n; j++)
for(int i=0; i<n;i++)
matrix[i][j] = 0;
readFile(file, matrix, n);
printMatrix(matrix, n);
return 0;
}
通过您提供的输入,我得到 output:
20 20 20 20 20
200 20 200 0 0
0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
但是查看您的命令行 arg 读取代码,我可以看到一些潜在的问题。 首先你使用atoi()。 当atoi失败时,它返回0。你知道这段代码有效吗? 一切都正确初始化了吗? 还是 atoi 在输入上失败,导致 n 为 0 并因此导致无法读取任何内容? (您可能希望研究stringstreams来做这种事情)。
此外,当 argc 不是 6 时,您会默默地失败并从未初始化的全局 memory 读取。 这个 memory 是垃圾。 你知道这不会发生吗? 如果你只是在做:
your.exe test.dat 5
那么 5 不会从命令行读取,因为 argc 不是 6。你是否总是像测试时一样传递 6 arguments? 也许不是,因为在当前的 state 中,您的代码实际上只需要文件名和大小。
最重要的是,看看你是否从命令行得到了你所期望的。
PS这是g++:
$ g++ --version g++ (Ubuntu/Linaro 4.4.4-14ubuntu5) 4.4.5 版权所有 (C) 2010 Free Software Foundation, Inc. 这是免费软件; 查看复制条件的来源。 没有保修; 甚至不考虑适销性或特定用途的适用性。
我建议像这样进行修复,使事情变得更加健壮:
#include <fstream>
#include <iostream>
#include <string>
#include <stdexcept>
template <size_t size>
void readFile(std::string file, double (&x)[size][size])
{
std::ifstream myfile(file.c_str());
for(int i=0; i<size; i++)
{
for(int j=0; j<size; j++)
{
if (!(myfile >> x[i][j]))
throw std::runtime_error("Couldn't read double from " + file);
}
}
}
int main(int argc, const char *const args[])
{
try
{
double data[10][10];
readFile("input.txt", data);
} catch(const std::exception& e)
{
std::cerr << "Whoops: " << e.what() << std::endl;
return 255;
}
return 0;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.