如何从文本文件中读取int和字符串?

时间:2016-09-12 17:33:43

标签: c++ csv

我有一个文本文件,其中包含每行的名称,能力,攻击和防御,例如:

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

1 个答案:

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