我正在尝试从文本文件中将数据读入数组。数据由几行双打组成。例如,这样的行:
0.019017584 -0.030264859 0.035091022 1.007338638 3.179054965 0.020865514 0.311854030
现在我正在考虑将二维数据表读入一维数组,然后线性访问它们。这是我尝试过的,但它不起作用。我是C ++的初学者。有人可以帮忙吗?
#include "stdafx.h"
#include <iostream>
#include <fstream>
using namespace std;
const int N = 500*7;
int main()
{
ifstream dataFile("C:\\Users\\Me\\Desktop\\Data.txt");
short i = 0;
int * data = new int[N];
double x;
while (!dataFile.eof())
{
dataFile >> x;
data[i] = x;
i++;
}
dataFile.close(); //closing the file
cout << data;
delete[] data;
return 0;
}
答案 0 :(得分:2)
由于这是C ++,你应该使用std::vector
来完成这类工作!
这就是我所做的(实际上是矩阵):(这也填充了矢量b)
typedef std::vector< std::vector<double> > Matrix;
void inputFile(Matrix& A, std::vector<double>& b) {
std::ifstream infile;
infile.open ( "input.txt" );
if(!infile) std::cout << "File not found!" << std::endl;
const size_t N = b.size();
for(size_t i = 0 ; i < N ; ++i)
for(size_t j = 0 ; j < N ; ++j)
infile >> A[i][j];
for(size_t i = 0 ; i < N ; ++i)
infile >> b[i];
}
提示:如果你知道每行会有多少双打,那么你可以更容易地做到这一点!
关于您的代码:
cout << data;
数据是一个数组,这意味着将输出数组的地址,而不是它的实际内容!要打印,您应该使用循环!
另外,您想阅读double
,但您的数据数组类型为int
!
最后,使用eof(),在while的条件下可能会让你读完最后一行两次!
答案 1 :(得分:1)
#include <iostream>
#include <fstream>
#include <vector>
int main()
{
std::ifstream dataFile("data.txt");
std::vector<double> vecData;
while (dataFile)
{
double dTemp;
dataFile >> dTemp;
vecData.push_back(dTemp);
}
dataFile.close();
for (unsigned i = 0; i < vecData.size(); ++i)
{
std::cout << vecData[i] << std::endl;
}
return 0;
}
有几点:
std::cout << data
要求程序打印出指针数据。在C / C ++中,指针只是一个数字,因此要求程序打印出数据将打印出存储第一个值的内存中的地址(数字)。为了打印出实际数据值,您需要使用另一个循环迭代所有加载的数据值。
不要混合类型:对于您的最大项目数N
,您使用的是int
,但对于您的计数器变量i
,您使用了short
。对两者使用相同的类型,可能是unsigned int
。
在你的循环中,不要只检查你的文件的结尾,检查文件是否仍然良好,你仍然可以从中读取。使用while (dataFile.good())
甚至while (dataFile)
。在使用您的数据或类似数据之前,您应该添加另一项检查。
由于您使用的是C ++,请考虑使用std::vector
或其他一些不错的容器,这会让事情变得更轻松,而且您不必担心忘记释放内存。