Получение количества столбцов и строк .csv-файла в C ++

0

Я пытаюсь написать код C++ для ввода значений из CSV файла в матрицу в C++. Файл.csv содержит значения с плавающей запятой, а размер обычно составляет> 100x100. Я не могу получить "нет". строк и столбцов из файла.csv. Они исходят из кода Matlab, который генерирует около 10. CSV файла, каждый из которых различается. Следовательно, мне нужно иметь возможность автоматически получать размер (в терминах строк и столбцов).csv файла, чтобы 2D-массив можно было преобразовать в код C++.

Код C++:

 #include <fstream>
 #include <vector>
 #include <string>
 #include <sstream>
 #include <stdlib.h>
 #include <iostream>

 /*const int ROWS = 2; 
 const int COLS = 7;*/
 const int BUFFSIZE = 80;

 int main()
 {
     char buff[BUFFSIZE];

     std::ifstream file("file.csv");
     std::string line;
     int col = 0;
     int row = 0;
     int a = 0, b = 0;

     while (std::getline(file, line))
     {
         std::istringstream iss(line);
         std::string result;
         while (std::getline(iss, result, ','))
         {
             col = col + 1;
             std::cout << col;
         }
         row = row + 1;
         std::cout << "\n";
         col = 0;
     }
     float array[row][col];


     while (std::getline(file, line))
     {
         std::istringstream iss(line);
         std::string result;
         while (std::getline(iss, result, ','))
         {
             array[a][b] = atof(result.c_str());
             b = b + 1;
         }
         a = a + 1;
         b = 0;
     }


     for (int i = 0; i < row; i++)
     {
         for (int j = 0; j < col; j++)
         {
             std::cout << array[i][j] << " ";
         }
         std::cout << "\n";
     }
     return 0;
 }

Выходные данные печатных контуров просто пусты. Файл.csv содержит 2x7. Как я могу это исправить? Это из-за многократного использования istringsteam() и getLine(). Незлая помощь. И обратите внимание, что я все еще новичок в C++.

  • 0
    убрать col=0; заявление. Код подсчитывает число столбцов, а затем устанавливает их в ноль.
  • 0
    Вы не можете использовать переменные времени выполнения в качестве статических измерений массива. Вы должны выделить динамически или использовать вектор: std::vector<std::vector<float>> array(row, std::vector<float>(col))
Теги:
csv

2 ответа

0
Лучший ответ

Вы забыли переместить позицию потока перед вторым контуром. По завершении последнего цикла while() поток достиг конца. Теперь вам нужно очистить состояние ошибки и вернуться назад (вы также можете просто закрыть и снова открыть файл):

file.clear();
file.seekg(0, std::ios_base::beg);

Более того, вы не можете использовать переменные времени выполнения как размеры статического массива. Ваш компилятор использует нестандартное расширение, если оно поддерживает это. Вы должны распределить динамически или использовать вектор:

std::vector<std::vector<float>> array(row, std::vector<float>(col))
  • 0
    Я не очень понимаю, что вы имеете в виду, используя переменные времени выполнения в качестве статического измерения массива. Не могли бы вы уточнить? Также я буду реализовывать предложенные вами команды; и опубликовать вывод.
  • 0
    Переменные , используемые для создания массива должны быть либо const или литералов (то есть 5 , 10 , 23 и т.д.). Оба эти качества позволяют знать их значения во время компиляции. Стандарт C ++ не допускает массивы переменной длины (массивы с измерениями, которые не являются const ). Некоторые компиляторы имеют расширения, которые позволяют вам делать это в любом случае, но они не соответствуют стандарту.
Показать ещё 19 комментариев
0

Вы можете подсчитать количество запятых в любой строке и что "count + 1" будет числом столбцов в вашем CSV файле.

Для количества строк вы можете просто написать что-то вроде этого -

int rows=0;
ifstream file("xyz.csv");
string line;
while (getline(file, line))
rows++;

Здесь "rows" будет количеством строк в вашем CSV файле.

Проверьте этот репозиторий, если вам нужен пример.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню