【问题标题】:How to read data form .CSV file using arrays instead of vectors in c++如何在 C++ 中使用数组而不是向量从 .CSV 文件中读取数据
【发布时间】:2021-09-20 20:52:13
【问题描述】:

我正在尝试使用 1D_array 而不是 1D_vector 和 2D 数组而不是 2D 矢量来读取 .csv 文件的内容。下面是我使用向量读取 .csv 文件的代码,它可以正常工作。 但是我的教授要求我使用数组而不是向量来解决进一步的优化问题。我曾尝试使用数组,但仍然无法获得它。 有人可以帮忙吗?

    //functoin to read dataset from .csv file.
bool read_data_set(string filename, vector<vector<int>>& vec_X_dataset, vector<int>& vec_Y_dataset) {
    int field0, field1, field2, field3, field4, field5, field6, field7, field8, field9, field10, field11,
        field12, field13, field14, field15, field16, field17, field18, field19, field20, field21;
    char comma;
    string line;
    ifstream myfile(filename);
    if (myfile.is_open())
    {
       while (myfile
            >> field0 >> comma
            >> field1 >> comma
            >> field2 >> comma
            >> field3 >> comma
            >> field4 >> comma
            >> field5 >> comma
            >> field6 >> comma
            >> field7 >> comma
            >> field8 >> comma
            >> field9 >> comma
            >> field10 >> comma
            >> field11 >> comma
            >> field12 >> comma
            >> field13 >> comma
            >> field14 >> comma
            >> field15 >> comma
            >> field16 >> comma
            >> field17 >> comma
            >> field18 >> comma
            >> field19 >> comma
            >> field20 >> comma
            >> field21)
        {

       vector<int> inner_vec{ field1, field2, field3, field4, field5, field6, field7, field8, field9, field10, field11,
      field12, field13, field14, field15, field16, field17, field18, field19, field20 };
            vec_X_dataset.push_back(inner_vec);
            vec_Y_dataset.push_back(field21);

        }
       myfile.close();

    }
    else {
        cout << "Unable to open file";
        return true;
    }
    return false;
}


int main() {

    cout << endl << "KNN  K-Nearest-Neighbors in C++" << endl << endl;
    cout << "please insert the value of K ";
    cin >> k;

    // Read dataset from file.
    string filename = ".//Cleaned Covid Dataset.csv";
    vector<vector<int>> vec_X_dataset{};
    vector<int> vec_Y_dataset{};
    bool error = read_data_set(filename, vec_X_dataset, vec_Y_dataset);
    if (error) {
        cout << "Exiting with error while reading dataset file " << filename << endl;
        exit(-1);
    }

bool read_data_set(string filename, int (&array_X_dataset)[5430][20], int (&array_Y_dataset)[5430]) { 整数字段0,字段1,字段2,字段3,字段4,字段5,字段6,字段7,字段8,字段9,字段10,字段11, 字段 12,字段 13,字段 14,字段 15,字段 16,字段 17,字段 18,字段 19,字段 20,字段 21; 字符逗号; 字符串线;

ifstream myfile(filename);
if (myfile.is_open())
{
    while (myfile
        >> field0 >> comma
        >> field1 >> comma
        >> field2 >> comma
        >> field3 >> comma
        >> field4 >> comma
        >> field5 >> comma
        >> field6 >> comma
        >> field7 >> comma
        >> field8 >> comma
        >> field9 >> comma
        >> field10 >> comma
        >> field11 >> comma
        >> field12 >> comma
        >> field13 >> comma
        >> field14 >> comma
        >> field15 >> comma
        >> field16 >> comma
        >> field17 >> comma
        >> field18 >> comma
        >> field19 >> comma
        >> field20 >> comma
        >> field21)
    {


        /*vector<int> inner_vec{field1, field2, field3, field4, field5, field6, field7, field8, field9, field10, field11,
   field12, field13, field14, field15, field16, field17, field18, field19, field20 };
        vec_X_dataset.push_back(inner_vec);
        vec_Y_dataset.push_back(field21);*/
    
        cout << field21 << endl; 

         for (size_t i = 0; i < 5430; i++)
        {
            array_Y_dataset[i] = field21;
        }

      

    }
    for (size_t i = 0; i < 5430; i++)
    {
        cout<< i << " "<< array_Y_dataset[i] << endl;
    }
  myfile.close();
  
}
else {
    cout << "Unable to open file";
    return true;
}
return false;

}

【问题讨论】:

  • 有什么问题?
  • 我需要使用数组而不是向量从文件中读取数据,但是我不知道如何,如果您知道使用数组从文件中读取的方式,请您编辑我的代码跨度>
  • 你试过用array替换vector吗?
  • 尝试将vector 替换为array,看看你是否明白发生了什么。如果您有任何问题,请根据您遇到的问题来编辑此问题。
  • 是的,我试过了,但它不起作用,因为数组在运行时无法改变它的大小

标签: c++ arrays vector


【解决方案1】:

试试这样的东西(未经测试,但应该可以),我希望它可以帮助你:

bool read_data_set(string filename, array<array<int, 20>, 5430>& vec_X_dataset, array<int, 5430>& vec_Y_dataset) {
    int field0, field1, field2, field3, field4, field5, field6, field7, field8, field9, field10, field11,
        field12, field13, field14, field15, field16, field17, field18, field19, field20, field21;
    char comma;
    string line;
    ifstream myfile(filename);

    int line = 0;

    if (myfile.is_open())
    {
       while (myfile
            >> field0 >> comma
            >> field1 >> comma
            >> field2 >> comma
            >> field3 >> comma
            >> field4 >> comma
            >> field5 >> comma
            >> field6 >> comma
            >> field7 >> comma
            >> field8 >> comma
            >> field9 >> comma
            >> field10 >> comma
            >> field11 >> comma
            >> field12 >> comma
            >> field13 >> comma
            >> field14 >> comma
            >> field15 >> comma
            >> field16 >> comma
            >> field17 >> comma
            >> field18 >> comma
            >> field19 >> comma
            >> field20 >> comma
            >> field21)
        {

       array<int, 20> inner_vec{ field1, field2, field3, field4, field5, field6, field7, field8, field9, field10, field11,
      field12, field13, field14, field15, field16, field17, field18, field19, field20 };
            vec_X_dataset[line] = inner_vec;
            vec_Y_dataset[line] = filed21;
            line++;

        }
       myfile.close();

    }
    else {
        cout << "Unable to open file";
        return false;
    }
    return true;
}

使用std::array 将使事情更清晰易读,并且更易于在代码中管理。这背后的主要思想,而使用std::vector,您只是在推送新值并且它会以它需要的方式增长(如果可以的话),如果您事先知道数组的大小,这意味着您知道每个数组中的位置一条数据会消失。

【讨论】:

  • array inner_vec = {{field1, field2, field3, field4, field5, field6, field7, field8, field9, field10, field11, field12, field13, field14, field15, field16,字段 17,字段 18,字段 19,字段 20 } };
  • 这行代码给我一个错误:“unitizer cannot convert from list to int”
  • 你的{太多了,应该是{field1, field2, ...而不是{{field1, field2, ...
  • 好的,我删除了多余的大括号,还添加了#include,因此错误已修复。谢谢。
  • 但是,这行代码又出现了一个错误。 array_X_dataset[line] = inner_vec ;错误提示“数组类型 int [20] 不可分配”
【解决方案2】:

在与 ShadowMitia 进行了一次有趣的对话后,问题得到解决,下面是修改后的代码。

bool read_data_set(string filename, array<array<int, 20>, 5430>& array_X_dataset, array<int, 5430>& array_Y_dataset) {
int field0, field1, field2, field3, field4, field5, field6, field7, field8, field9, field10, field11,
    field12, field13, field14, field15, field16, field17, field18, field19, field20, field21;
char comma;
int line = 0;
  
ifstream myfile(filename);

if (myfile.is_open())
{
    while (myfile
        >> field0 >> comma
        >> field1 >> comma
        >> field2 >> comma
        >> field3 >> comma
        >> field4 >> comma
        >> field5 >> comma
        >> field6 >> comma
        >> field7 >> comma
        >> field8 >> comma
        >> field9 >> comma
        >> field10 >> comma
        >> field11 >> comma
        >> field12 >> comma
        >> field13 >> comma
        >> field14 >> comma
        >> field15 >> comma
        >> field16 >> comma
        >> field17 >> comma
        >> field18 >> comma
        >> field19 >> comma
        >> field20 >> comma
        >> field21)
    {


     array<int, 20> inner_array{ field1, field2, field3, field4, field5, field6, field7, field8, field9, field10, field11,
     field12, field13, field14, field15, field16, field17, field18, field19, field20 };
        array_X_dataset[line] = inner_array; 
        array_Y_dataset[line] = field21;           
        line++;

    }
      
  myfile.close();
  
}
else {
    cout << "Unable to open file";
    return true;
}
return false;

}

int main() {

// Read dataset from file.
string filename = ".//Cleaned Covid Dataset.csv";

//int array_Y_dataset[5430] = {};
//int array_X_dataset[5430][20] = {};
array<array<int, 20>, 5430> array_X_dataset{}; 
array<int, 5430> array_Y_dataset{};
bool error = read_data_set(filename, array_X_dataset, array_Y_dataset);
if (error) {
    cout << "Exiting with error while reading dataset file " << filename << endl;
    exit(-1);
}

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-22
    • 1970-01-01
    • 2011-11-17
    • 2018-10-03
    • 2022-01-01
    • 2018-09-01
    • 1970-01-01
    相关资源
    最近更新 更多