读取数据文件并将每列分配给各个数组

时间:2014-02-11 16:56:16

标签: c++ arrays

我是c ++的初学者,我在将数据文件中的列导入单个数组时遇到问题。 我的数据文件如下所示:

1 81 0 79 89 
2 81 0 79 89 
3 81 0 79 89 
4 81 0 79 89 
5 81 0 79 89 
6 81 0 79 89 
7 81 0 79 89 
8 81 0 79 89 
9 81 0 79 89 
10 81 0 79 89 

现在我要做的是将前三列导入单个数组。例如,数组“happinessseries1”(与第2列相关联)应具有值{81,81,81,81,81,81,81,81,81,81}。

我的代码如下所示:

#include <fstream>
#include <iostream>
#include <string>
using namespace std;

 int main()
 {

 ifstream inFile; 

 int neglible[100];         //size of arrays bigger than number of entries in data file
 int happinessseries1[100];
 int happinessseries2[100];

 int i=0;
inFile.open("happiness.dat");
if (inFile.fail())
{
    cout << "Error" << endl;
    return 1;
}
while (!inFile.eof())
{
    inFile >> neglible[i];
    inFile >> happinessseries1[i];
    inFile >> happinessseries2[i];
    i++;

    cout << happinessseries1[i] << endl;  // display values in the array to check that the correct values have been imported                                             
}
inFile.close();

return 0;

 }

为happinessseries1显示的值与原始列值不同。 任何人都可以看到我的代码中有什么问题以及如何纠正它。 这也是我第一次发布一个问题所以请告诉我是否需要澄清任何问题。 提前谢谢!

4 个答案:

答案 0 :(得分:1)

你需要交换这两行:

i++;
cout << happinessseries1[i] << endl;  // display values in the array to check that the correct values have been imported

您正在递增i,然后打印出第i个元素的值 - 尚未设置!你应该打印,然后递增。

答案 1 :(得分:0)

不确定。您有三列以上的数据,您有五列。现在你只是一次读取一个数字,好像只有三列数据。如果你知道你总是有五列,那么你可以将两次丢弃一次,以忽略最后两列。一个“更好”的解决方案是查看stringstreams和cin.getline()。

并确保您没有打印出未初始化的值。现在你正在递增i然后打印出数组值。糟糕!

答案 2 :(得分:0)

您的示例数据每行有5个数字。

您的代码似乎假设每行3个数字。


此外,您正在输出尚未设置的数组项,因此除了程序中的数据不正确外,输出与数据无关。


顺便说一下,不要测试!stream.eof(),而是测试!stream.fail()。哪个可以写成stream。每次阅读后都要检查是否有失败。

<小时/> 顺便说一下,不要从1返回main来表示失败。即使它适用于Windows和* nix平台,它也是特定于平台的。而是使用EXIT_FAILURE标题中的标准<stdlib.h>


另外,顺便提一下,考虑使用AStyle之类的工具来修复缩进。

将SOID修复工作的负担留给SO读者是不礼貌的。


而且......请考虑使用 std::vector 而不是原始数组。

然后你不会遇到问题,例如文件数据集大小超过数组大小。

答案 3 :(得分:0)

有许多事情需要很长时间才能解决您的代码,所以在此期间这是一个简单的例子:

#include <iostream>
#include <fstream>
#include <string>
#include <cstdlib>
#include <vector>
using namespace std;

int main() {
    const int COLUMNS = 5;

    vector< vector <int> > data;

    string filename = "myfile.txt";

    ifstream ifile(filename.c_str());


    if (ifile.is_open()) {
        int num;

        vector <int> numbers_in_line;

        while (ifile >> num) {
            numbers_in_line.push_back(num);

            if (numbers_in_line.size() == COLUMNS) {
                data.push_back(numbers_in_line);
                numbers_in_line.clear();
            }
        }
    }
    else {
        cerr << "There was an error opening the input file!\n";
        exit(1);
    }

    //now get the column from the 2d vector:
    vector <int> column;
    int col = 2;//example: the 2nd column

    for (int i = 0; i < data.size(); ++i) {
        column.push_back(data[i][col - 1]);
        cout << column[i] << endl;
    }

    ifile.close();
}

输出:

81
81
81
81
81
81
81
81
81
81

正如所料。

警告:没有断言来验证所需的列是否小于读取的列数,或者是否使用了迭代器。所有这些都可以自己完成。

关于您的代码:

  1. 您的数组就是:数组。这意味着您的程序可以(取决于提供的输入)适当,如果数据太少则浪费,或者如果提供的数据太多则会崩溃。使用向量代替它们,因为它们不仅与常规数组非常相似,而且在语法上相似,并且内置了引导的额外功能:例如它们可以调整大小。

  2. 那么,如何解决您的问题?正如其他人之前提到的,您的数据有5列,因此您可以使用它们。一种方式(如上所述)是,在我们读完五个数字后,我们知道这构成一条线,我们可以阅读下一个。因此,可以对文件的其余部分重复此通用算法,并且该算法适用于任何给定的非零数量的输入行(此格式)。

  3. 最后,一旦填充了数据容器,就可以迭代它并提取所需的列,如图所示。为简单起见,我在阅读并填充了data向量之后就已经这样做了,但这也可以在阅读时完成(可以说更快)。

相关问题