读取包含小数的文件时出现问题
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
希望有人能帮助我,因为我研究了一些关于这个的信息,并没有真正找到一个解决方案。
您的读取和打印代码似乎可以工作,但是您的命令行读取代码可能有一些问题。
我运行你的代码没有得到命令行参数。下面的代码,基本上是从你的主代码复制粘贴过来的,除了获取命令行参数。
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;
}
使用您提供的输入,我得到输出:
20 20 20 20 20 20
200 20 200 00 00
0 0 0 0 0
然而看着你的命令行参数读取代码,我可以看到一些潜在的问题。首先使用atoi()。当atoi失败时,它返回0。你知道这个代码是有效的吗?一切都被正确初始化了吗?或者是atoi在输入上失败,导致n为0,因此没有任何东西被读入?(您可能希望查看stringstreams来做这种事情)。
此外,当argc不为6时,您将静默失败并从未初始化的全局内存中读取。这些内存是垃圾。你知道这是不可能的吗?如果你正在做:
your.exe test.dat 5
则不会从命令行读取5,因为argc不是6。你是否总是像测试时一样传递6个参数?也许不是,因为在当前状态下,你的代码实际上只需要文件名和大小。
最重要的是,看看你是否从命令行中得到了你所期望的。
PS这是g++:
$ g++——versiong++ (Ubuntu/Linaro 4.4.4-14 Ubuntu)4.4.5 Free Software Foundation, Inc.版权所有(C) 2010这是免费的软件;请参阅源代码进行复制条件。没有保修;不即使是为了适销性或适用性为了一个特殊的目的。
我建议这样修复,使事情更健壮:
#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;
}
您的输入操作符将读取数字,但将换行符保留在文件中。
请参阅以下答案,了解如何在读取值后ignore()
行尾
为什么我们要在读取输入后调用cin.clear()和cin.ignore() ?
- 使用mongocxx驱动程序时包含头文件问题
- 在WSL:configure_file上对config_file的每次调用都失败:配置文件时出现问题
- 编译要在英特尔Hyperscan中使用的.cc文件时出现问题
- 使用 seekg() 读取C++中的文件时出现问题
- sqlite3 和生成文件中的链接出现问题
- C++头文件和类实现出现问题
- 用户输入字符串的文件附加问题..C++
- node-gyp 的先有鸡还是先有蛋的问题:指向依赖项中的头文件
- 读取文件并将其存储在unordered_map中时出现问题
- 编译 llvm 插件时出现问题:llvm/Config/llvm-config.h:没有这样的文件或目录
- 我在使用C++文件时遇到了一些问题
- 在Linux上使用Clang / OLLVM交叉编译helloworld Windows可执行文件时的问题
- 将文件复制到自定义位置,存在字符串转换问题
- DirectX12 的问题:"d3dApp.h":没有这样的文件或目录
- (ODR 使用问题)在不同文件中priority_queue名称相同的结构
- C++模板编程设计问题 - 根据输入文件返回不同的类型
- 读取制表符分隔的文件时出现问题 C++
- 当我在 CLion 中读取数组中的 txt 文件时C++编码问题
- 使用 RapidXML 解析大型 XML(大小大于 65 KB)文件时出现问题
- C++:读取.BMP文件时出现问题;文件结束时间早于预期