Как читать файл формы данных .CSV с использованием массивов вместо векторов в c

#c #arrays #vector

Вопрос:

Я пытаюсь прочитать содержимое файла .csv, используя 1D_array вместо 1D_vector, и 2D-массивы вместо 2D-вектора. Ниже приведен мой код чтения файла .csv с использованием вектора, и он работает правильно. Но мой профессор попросил меня использовать массивы вместо векторов для дальнейшей оптимизации. Я пытался использовать массивы, но все еще не могу их получить. Кто-нибудь может помочь, пожалуйста?

     //functoin to read dataset from .csv file.
bool read_data_set(string filename, vector<vector<int>>amp; vec_X_dataset, vector<int>amp; 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 имя файла, тип int (amp;array_X_dataset)[5430][20], тип int (amp;array_Y_dataset)[5430]) {
инт field0, field1, поле2, поле3, поле4, field5, field6, field7, field8, field9, field10, field11,
field12, field13, field14, field15, field16, field17, field18, field19, field20, field21;
запятая;
строка строка;

 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;
 

}

Комментарии:

1. В чем проблема?

2. Мне нужно прочитать данные из файла, используя массивы вместо векторов, но я не знаю как, не могли бы вы отредактировать мой код, если вы знаете, как использовать массивы для чтения из файла

3. Вы пробовали просто заменить vector на array ?

4. Попробуйте просто заменить vector на array , посмотрите, понимаете ли вы, что происходит. Если у вас есть какие-либо проблемы, приходите и отредактируйте этот вопрос с учетом имеющихся у вас проблем.

5. да, я пытался, но это не работает, так как массивы не могут изменять свой размер во время выполнения

Ответ №1:

Попробуйте что-нибудь подобное (непроверенное, но должно сработать), я надеюсь, это вам поможет:

 bool read_data_set(string filename, array<array<int, 20>, 5430>amp; vec_X_dataset, array<int, 5430>amp; 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 вы просто вводите новые значения, и он растет так, как ему нужно (что, если все в порядке), если вы заранее знаете размер массива, это означает, что вы знаете, куда в массиве будет помещаться каждый фрагмент данных.

Комментарии:

1. массив<int, 5430> inner_vec = {{поле 1, поле 2, поле 3, поле 4, поле 5, поле 6, поле 7, поле 8, поле 9, поле 10, поле 11, поле 12, поле 13, поле 14, поле 15, поле 16, поле 17, поле 18, поле 19, поле 20 } };

2. Эта строка вашего кода выдает мне сообщение об ошибке : «unitizer не может преобразовать из списка в int».

3. У вас их слишком много { , этого {field1, field2, ... не должно быть {{field1, field2, ...

4. хорошо, я удалил лишние фигурные скобки, а также добавил #include<массив>, таким образом, ошибка исправлена. Спасибо.

5. Но в этой строке кода появилась еще одна ошибка. array_X_dataset[строка] = inner_vec ; ошибка гласит, что » тип массива int [20] не может быть назначен »

Ответ №2:

После интересного разговора с ShadowMitia проблема была решена, и ниже приведен код после изменений.

 bool read_data_set(string filename, array<array<int, 20>, 5430>amp; array_X_dataset, array<int, 5430>amp; 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);
}
 

}