Как организовать данные из текстового файла в многомерных массивах и умножить столбцы из него? - PullRequest
1 голос
/ 30 марта 2019

Извините, я немного новичок в c ++, но мне нужно организовать данные из текстового файла в массив (или вектор, если это проще), и он должен иметь 12 столбцов и 10000 строк.Мне нужно иметь возможность умножить эти столбцы, но я не могу отложить размещение данных в строках.Данные анализируются по вкладкам и уже в формате 12x10000.Как я могу сделать это только с помощью c ++?

Я уже пробовал смотреть онлайн, и у меня нет ничего, кроме как читать текст.У меня есть еще 225 строк кода, которые являются всеми попытками сделать это.По сути, это сводится к этим линиям.У меня есть парсер, но он ничего не делает, кроме деления данных на вкладки, а не их идентификации.

#include <iostream>
#include <fstream>
#include <string>
using namespace std;
int main ()
{
    float array[12][10000]; // creates array to hold names
    long loop=0; //short for loop for input
    float line; //this will contain the data read from the file
    ifstream myfile ("data.txt"); //opening the file.
    if (myfile.is_open()) //if the file is open
    {
        while (! myfile.eof() ) //while the end of file is NOT reached
        {
            getline (myfile,line); //get one line from the file
            array[loop] = line;
            cout << array[loop] << endl; //and output it
            loop++;
        }
        myfile.close(); //closing the file
    }
    else cout << "Unable to open file"; //if the file is not open output
    system("PAUSE");
    return 0;
}

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

Ответы [ 2 ]

1 голос
/ 30 марта 2019

Здесь простое решение, которое работает для разделителей, которые являются табуляцией или пробелами.

#include <iostream>
#include <fstream>
#include <string>

using namespace std;

constexpr size_t rows_len = 10000;
constexpr size_t cols_len = 12;

int main ()
{
    float array[rows_len][cols_len]{}; // value initialization to ensure unfilled cells at 0
    ifstream myfile("data.txt");
    if (!myfile.is_open()) {
        cout << "Unable to open file" << endl;
        return 1;
    }
    string line;
    for (size_t row = 0; row < rows_len && myfile; row++) {
        getline(myfile, line);
        const char* s = line.c_str();
        for (size_t col = 0; col < cols_len; col++) {
            char* p = nullptr;
            array[row][col] = strtof(s, &p);
            s = p;
        }
    }

    // use array ...

    return 0;
}

Второй аргумент strtof() позволяет узнать, где находится начало следующей ячейки.Если ячейка не является числом, все оставшиеся строки array устанавливаются в 0.

0 голосов
/ 30 марта 2019

Если вы уверены, что формат ввода будет соблюдаться, вы можете просто позволить модулю iostream декодировать значения с плавающей запятой:

#include <iostream>
#include <fstream>
#include <string>
using namespace std;
int main ()
{
    float array[12][10000]; // creates array to hold names
    long loop=0; //short for loop for input
    float line; //this will contain the data read from the file
    ifstream myfile ("data.txt"); //opening the file.
    if (myfile.is_open()) //if the file is open
    {
        for(int line=0; line <1000; line++) //read 1000 lines
        {
            for (int col=0; col<12; col++)  // 12 values per line
            {
                myfile >> arr[col][line];
                if (!myfile)
                {
                    cout << "Read error line " << line << " col " << col << "\n";
                    myfile.close();
                    return 1;
                }
            }
        }
        myfile.close(); //closing the file
    }
    else cout << "Unable to open file"; //if the file is not open output
    system("PAUSE");
    return 0;
}

Обратите внимание, что в этом коде не используется нахмурившееся while (! Myfile.eof ()) , но тестируется сразу после чтения

...