我有一个文本文件,其中包含每行的名称,能力,攻击和防御,例如:
Bill Punch 10 5
Jack Jab 7 7
Joe Kick 8 4
我想阅读该文件并存储其内容。我可以使用数组,但我希望能够继续添加行。所以我实现了一个计算线条的函数。数组喜欢在运行时抱怨值不是静态的,所以我开始尝试向量。以下是代码。
我试图将每个值插入矩阵的x,y,然后通过并打印出来。但它不起作用;它打开命令提示符并要求输入我的文件名。我这样做,但它就停止了。
另外,如何将矢量返回到main
函数?
#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
using namespace std;
// Global Variables
int numLines = 0;
string fileName;
int countLines();
string openFile();
int main() {
string name, attack;
cout << "What is the name of your data file?" << endl;
getline(cin, fileName);
cout << countLines() << endl;
cout << openFile() << endl;
}
int countLines() {
ifstream dataFile(fileName);
string line;
while (getline(dataFile, line)) {
numLines++;
}
return numLines;
}
string openFile() {
vector<vector<int>> dataVec(numLines, vector<int>(4));
ifstream dataFile(fileName);
string line;
while (getline(dataFile, line)) {
for (int i = 0; i == numLines - 1; i++) {
for (int o = 0; o == 4; o++) {
cin >> dataVec[i][o];
}
}
}
while (getline(dataFile, line)) {
for (int i = 0; i == numLines - 1; i++) {
for (int o = 0; o == 4; o++) {
cout << dataVec[i][o];
}
}
}
return dataVec;
}
答案 0 :(得分:1)
有比您使用的更好的方法来读取CSV。读入数据文件的方法很复杂并且存在缺陷。简化算法可以减少缺陷数量。
例如,使用结构来建模数据行。让我们调用每一行数据,一条记录。
struct Record
{
std::string first_name;
std::string last_name;
int number1;
int number2;
};
您可以将记录存储到简单的std::vector
:
std::vector<Record> database;
一种方法是在其数据成员中读取Record
:
struct Record
{
std::string first_name;
std::string last_name;
int number1;
int number2;
friend istream& operator>>(istream& input, Record& r);
};
istream& operator>>(istream& input, Record& r)
{
input >> r.first_name;
input >> r.last_name;
input >> r.number1;
input >> r.number2;
return input;
};
这使您可以简化输入循环:
Record r;
while (data_file >> r)
{
database.push_back(r);
}
如果您需要知道文件中的行数,可以使用database.size()
。否则,无需知道文件中的行数。
同样,您可以编写打印记录的方法。如果重载operator<<
,则print语句变为:
cout << database[i] << endl;