C ++ ifstream разделен на w.r.t. характер

я хотел бы C ++ — читать файл строка за строкой, и разделить каждую строку w.r.t к "\t" символ, чтобы заполнить матрицу. мой код будет выглядеть так

    ifstream data_x;
double** test_data = new double*[100];
for(int j = 0 ; j <  ; j++)
test_data[j] = new double[4];

data_x.open("X.txt");

int i = 0;
if (data_x.is_open())
{
while (!data_x.eof())
{
char** split = data_x.split("\t")
for(int k = 1 ; k < 4 ; k++)
test_data[i][k];
i++;
}
}

data_x.close();

ifstream data_y;
data_y.open("Y.txt");

i = 0;
if (data_y.is_open())
{
while (!data_y.eof())
{
data_y >> test_data[i][0];
i++;
}
}

data_y.close();

где синтаксис

 char** split = data_x.split("\t")
for(int k = 1 ; k < 4 ; k++)
test_data[i][k];

является приблизительным. как сделать это правильно с C ++?

Спасибо

-1

Решение

Предполагая, что ваш файл содержит только цифры, вот стандартная идиома C ++:

#include <vector>
#include <string>
#include <sstream>
#include <fstream>

std::ifstream infile("data.txt");

std::vector<std::vector<double>> matrix;

for (std::string line; std::getline(infile, line); )
{
std::istringstream iss(line);
std::vector<double> row;

for (double d; iss >> d; )
{
row.push_back(d);
}

matrix.push_back(row);
}

Если вы знаете размер матрицы, вы можете добавить соответствующие reserve звонки, чтобы избежать перераспределения векторов. Вы также можете добавить тесты на наличие каких-либо нераспознанных данных в строке, но сейчас вам следует начать.

3

Другие решения

Создание вектора из сущностей, разделенных пробелами, на самом деле тривиально:

std::vector<T> fields(
std::istream_iterator<T>(
d::istringstream(line) >> std::skipws),
std:.istream_iterator<T>()));

Если вы тип клетки T это то, что будет рассматривать другие пространства, чем '\t' в качестве разделителей вы можете изменить то, что считается пробелом, используя модифицированный std::ctype<char> фаска.

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

0

По вопросам рекламы [email protected]