用C ++读取数据

时间:2014-04-27 12:37:22

标签: c++

我正在尝试从文本文件中将数据读入数组。数据由几行双打组成。例如,这样的行:

  

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;
}

2 个答案:

答案 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;
}

有几点:

  1. std::cout << data要求程序打印出指针数据。在C / C ++中,指针只是一个数字,因此要求程序打印出数据将打印出存储第一个值的内存中的地址(数字)。为了打印出实际数据值,您需要使用另一个循环迭代所有加载的数据值。

  2. 不要混合类型:对于您的最大项目数N,您使用的是int,但对于您的计数器变量i,您使用了short。对两者使用相同的类型,可能是unsigned int

  3. 在你的循环中,不要只检查你的文件的结尾,检查文件是否仍然良好,你仍然可以从中读取。使用while (dataFile.good())甚至while (dataFile)。在使用您的数据或类似数据之前,您应该添加另一项检查。

  4. 由于您使用的是C ++,请考虑使用std::vector或其他一些不错的容器,这会让事情变得更轻松,而且您不必担心忘记释放内存。