打开文件并将数据放入双向量C ++中

时间:2016-07-16 20:13:12

标签: c++ arrays file

我是C ++的初学者,在我的程序开始时,我试图将来自csv文件的数据输入到双向量中。

但是,当我尝试运行程序时,我不断在这个范围内声明'row'和'col'。

我尝试通过放'int row来解决这个问题; int col; 'above'字符串输入[row] [col];'试图解决问题 但后来我得到错误“数组绑定不是一个整数常量'''令牌”。

我想知道如何解决这个问题?或者,如果有一些我遗失的东西,我没有意识到。

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


string input[row][col];
const int ROW = 10;
const int COL = 4;
string input[ROW][COL];
const string datatable = "table2.csv";
string line;
int col = 0;
int row = 0;


void readCSV()   ////this is the function to read the file
{
    ifstream file(datatable);   ///opens file
    while (getline(file, line))
    {
        istringstream iss(line); //takes out white
        string result;
        while (getline(iss, result, ','))
        {
            input[row][col] = result; // creates string for element
            col = col + 1;
        }
        row = row + 1;
        col = 0;

    }

2 个答案:

答案 0 :(得分:0)

至少,您需要删除第一个

string input[row][col];

毕竟,input被声明(正确)几行。

答案 1 :(得分:0)

我希望你不要认为这是冒犯性的,但这里有多个错误。

我将首先评论您的代码以显示错误的位置,然后我将解释这些问题:

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


string input[row][col]; /* <- "row" and "col" are not yet defined */
const int ROW = 10;
const int COL = 4;
string input[ROW][COL]; /* <- you already have a variable named "input" */
const string datatable = "table2.csv";
string line;
int col = 0;
int row = 0;


void readCSV()
{
    ifstream file(datatable);   ///opens file
    while (getline(file, line)) /* <- no check to make sure max rows are not exceeded */
    {
        istringstream iss(line); //takes out white
        string result;
        while (getline(iss, result, ',')) /* No check to make sure max columns are not exceeded */
        {
            input[row][col] = result; // creates string for element
            col = col + 1;
        }
        row = row + 1;
        col = 0;

    }

要修改这些,我会做以下事情:

  1. 我会删除string input[row][col],因为这是后面正确定义的。
  2. 我会将while (getline(file, line))更改为while (getline(file, line) && row < ROW)
  3. 我会将while (getline(iss, result, ','))更改为while (getline(iss, result, ',') && col < COL)
  4. 我不保证这些是唯一的问题,并且在纠正这些问题后代码将完美运行。 (我很少用C ++编程,所以我无法100%放心地保证。)但是,这些只是我刚才注意到的一些初始错误/问题。

    修改:作为补充说明,我同意另一个已发布的答案(现在似乎已删除),建议将ROWCOL更改为预处理器定义/宏。例如,const int ROW = 10将变为#define ROW 10const int COL = 4将变为#define COL 4。在这里的示例中,它不会引起巨大的变化,但是这里的好处是ROWCOL不会占用内存空间作为变量,因为编译器将替换对{{1的所有引用}和COL,文字定义值分别为4和10。

    这有点基于偏好的建议,但是,随意做任何你觉得更舒服的事情。只是基于您提供的代码片段,您可能无论如何都不会看到任何性能变化。但是,我想对此提出个人意见,因为另一个答案表明了这一点。