Чтение переменных из файла txt, c++

Здравствуйте не могу считать данные из файла txt.

Необходимо считать данные из файла in.txt, присвоить их переменным произвести расчет и вывести в out.txt первые 3 числа строки это a,b,c, а следующие 3 числа d,e,f.

проблема заключается в том что в файле in.txt не везде ест пробелы (пропуски между числами есть, но это не пробелы)

in.txt 22.3006 48.6023 9.02775 11.9922 44.0127 0 13.594 50.3196 9.39835 0.457838 45.7965 0 38.5442 71.8578 10.9573 13.4781 55.5796 0 50.1875 50.7744 9.56446 15.4972 45.28 0 29.7052 55.7017 11.3449 14.0485 49.6916 0 37.6103 56.9118 10.032 9.90303 50.0036 0 67.7743 87.2517 10.5497 15.9975 54.8979 0 34.3831 54.5625 12.0519 18.4368 52.0368 0 34.0692 63.1499 10.7447 9.21688 49.9357 0 41.0152 71.1705 9.32704 11.3531 54.045 0 in.txt

out.txt 22.3006 48.6023 9.02775 11.9922 44.0127 0 13.594 50.3196 9.39835 0.457838 45.7965 0 38.5442 71.8578 10.9573 13.4781 55.5796 0 50.1875 50.7744 9.56446 15.4972 45.28 0 29.7052 55.7017 11.3449 14.0485 49.6916 0 37.6103 56.9118 10.032 9.90303 50.0036 0 67.7743 87.2517 10.5497 15.9975 54.8979 0 34.3831 54.5625 12.0519 18.4368 52.0368 0 34.0692 63.1499 10.7447 9.21688 49.9357 0 41.0152 71.1705 9.32704 11.3531 54.045 0

out.txt

fstream clear_file("out.txt", ios::out);
clear_file.close();

ofstream outf ("out.txt",ios::app) ;
if (!outf)
{
    ShowMessage("Файл не удается открыть");
    return;
}
outf
     << "a  "
     << "b  "
     << "c  "
     << "d  "
     << "e  "
     << "f  ";
outf.close();

ifstream infile("in.txt");
if (infile.is_open())
{

int count = 0; 
float temp;

while (!infile.eof())
{
    infile >> temp;
    count++;
}
//В начало файла
infile.seekg(0, ios::beg);
infile.clear();

int count_space = 0;
char symbol;
while (!infile.eof())
{
    infile.get(symbol);
    if (symbol == ' ') count_space++;
    if (symbol == '\n') break;
}
//В начало файла
infile.seekg(0, ios::beg);
infile.clear();

double a, b, c, d, e, f;
int i = 0, j = 0;
int n = count / (count_space + 1);
int m = count_space + 1;
double **x;
x = new double*[n];
for (i = 0; i < n; i++) x[i] = new double[m];

for (i = 0; i < n; i++)
{
    for (j = 0; j < m; j++)
    {
        infile >> x[i][j];
    }
    a = x[i][0];
    b = x[i][1];
    c = x[i][2];
    d = x[i][3];
    e = x[i][4];
    f = x[i][5];// потом считаем, строим график

    ofstream outf ("out.txt",ios::app) ;
    if (!outf)
    {
        ShowMessage("Файл не удается открыть");
        return;
    }
    outf
         << a << " "
         << b << " "
         << c << " "
         << d << " "
         << e << " "
         << f << "\n";
    outf.close(); // Считываем следующую строку из файла in.txt
} 

infile.close();
}
else
{
    ShowMessage("файл не удается открыть");
    return;
}

Ответы (1 шт):

Автор решения: NunOfIt
#include <vector>
#include <fstream>
#include <iostream>

int scan(std::ifstream* in, double* values, size_t count) {
    static std::ifstream* in_ptr = nullptr;

    if(!in && !in_ptr) { throw std::invalid_argument("Входной поток не может быть незаданным!"); }
    if(in) { in_ptr = in; }

    if(!values) { return 2; }
    if(in_ptr->eof()) { return 1; }

    for(size_t i = 0; i < count; ++i) {
        while(!in_ptr->eof() && !std::isdigit(in_ptr->peek())) { (void) in_ptr->get(); }
        if(in_ptr->eof()) { return 1; }
        *in_ptr >> values[i];
    }
    return 0;
}

int main() {
    const size_t SIZE = 6;
    double values[SIZE];
    std::vector<std::vector<double>> vec;

    std::ifstream in("in.txt");
    if (!in.is_open()) {
        std::cerr << "Не получилось открыть \"in.txt\"!";
        return 1;
    }

    std::ofstream out("out.txt");
    if(!out.is_open()) {
        std::cerr << "Не получилось открыть \"out.txt\"!";
        return 2;
    }

    out << "a b c d e f\n";
    (void) scan(&in, nullptr, 0);
    while(!scan(nullptr, &values[0], SIZE)) {
        out << values[0];
        for(size_t i = 1; i < SIZE; ++i) { out << ' ' << values[i]; }
        out << '\n';
        
        vec.push_back(std::vector(&values[0], &values[SIZE]));
    }

    in.close();
    out.close();
    return 0;
}

in.txt:

5.67 28334.7     45.67:0.7|9650 0.25

7.8     56  67km89l 7 9
3 4

out.txt:

a b c d e f
5.67 28334.7 45.67 0.7 9650 0.25
7.8 56 67 89 7 9
→ Ссылка