Я пытаюсь написать код 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++.
Вы забыли переместить позицию потока перед вторым контуром. По завершении последнего цикла while()
поток достиг конца. Теперь вам нужно очистить состояние ошибки и вернуться назад (вы также можете просто закрыть и снова открыть файл):
file.clear();
file.seekg(0, std::ios_base::beg);
Более того, вы не можете использовать переменные времени выполнения как размеры статического массива. Ваш компилятор использует нестандартное расширение, если оно поддерживает это. Вы должны распределить динамически или использовать вектор:
std::vector<std::vector<float>> array(row, std::vector<float>(col))
const
или литералов (то есть 5
, 10
, 23
и т.д.). Оба эти качества позволяют знать их значения во время компиляции. Стандарт C ++ не допускает массивы переменной длины (массивы с измерениями, которые не являются const
). Некоторые компиляторы имеют расширения, которые позволяют вам делать это в любом случае, но они не соответствуют стандарту.
Вы можете подсчитать количество запятых в любой строке и что "count + 1" будет числом столбцов в вашем CSV файле.
Для количества строк вы можете просто написать что-то вроде этого -
int rows=0;
ifstream file("xyz.csv");
string line;
while (getline(file, line))
rows++;
Здесь "rows" будет количеством строк в вашем CSV файле.
Проверьте этот репозиторий, если вам нужен пример.
col=0;
заявление. Код подсчитывает число столбцов, а затем устанавливает их в ноль.std::vector<std::vector<float>> array(row, std::vector<float>(col))