我是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显示的值与原始列值不同。 任何人都可以看到我的代码中有什么问题以及如何纠正它。 这也是我第一次发布一个问题所以请告诉我是否需要澄清任何问题。 提前谢谢!
答案 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
正如所料。
警告:没有断言来验证所需的列是否小于读取的列数,或者是否使用了迭代器。所有这些都可以自己完成。
关于您的代码:
您的数组就是:数组。这意味着您的程序可以(取决于提供的输入)适当,如果数据太少则浪费,或者如果提供的数据太多则会崩溃。使用向量代替它们,因为它们不仅与常规数组非常相似,而且在语法上相似,并且内置了引导的额外功能:例如它们可以调整大小。
那么,如何解决您的问题?正如其他人之前提到的,您的数据有5列,因此您可以使用它们。一种方式(如上所述)是,在我们读完五个数字后,我们知道这构成一条线,我们可以阅读下一个。因此,可以对文件的其余部分重复此通用算法,并且该算法适用于任何给定的非零数量的输入行(此格式)。
最后,一旦填充了数据容器,就可以迭代它并提取所需的列,如图所示。为简单起见,我在阅读并填充了data
向量之后就已经这样做了,但这也可以在阅读时完成(可以说更快)。