Как прочитать значения из файла, а затем использовать их для инициализации 2D-массива C ++ - PullRequest
0 голосов
/ 30 сентября 2018

Я хочу прочитать текстовый файл, такой как

4
2
3
4 3
2 1
5 4
8 4

Первая строка - это первое измерение двумерного массива, а вторая - второе измерение двумерного массива, а третья строка -значение.После считывания и сохранения первых трех значений в переменные n, m, ki хотел бы инициализировать двумерный массив int int x [n] [m].

#include <iostream>
#include <fstream>
#include <string>
#include <math.h>

using namespace std;

int n,m,k;

int main()
{
    ifstream File;
    File.open("text.txt");

    if (File.fail()) {
        cout << "error opening file";
    }

    while (!File.eof())
    {
            File >> n;
            File >> m;
            File >> k;

            int x[n][m];

            for (int i = 0; i < 3; i++) {
                for (int j = 0; j < 5; j++) {
                    File >> x[i][j];
                }
            }

    }
    return 0;
}

Однако я не могу инициализировать массив какоказывается, что выражения n и m не имеют постоянных значений.Если бы я установил переменные равными const int n, m, k, я бы не смог прочитать их из файла, используя >>.Как я могу прочитать значения размеров массива, использовать их для создания массива, а затем сохранить значения в них?

edit:

#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <math.h>

using namespace std;
std::vector < std::vector <int>> x;

int n,m,k;

int main()
{
    ifstream File;
    File.open("test.txt");

    if (File.fail()) {
        cout << "error opening file";
    }

    while (!File.eof())
    {
            File >> n;
            File >> m;
            File >> k;

            for (int i = 0; i < n; i++) {
                vector <int> row;
                for (int j = 0; j < m; j++) {
                    int readFromFile = 0;
                    File >> readFromFile;
                    row.push_back(readFromFile);
                }
                x.push_back(row);
            }

    }

    cout << n;
    cout << "\n";
    cout << m;
    cout << "\n";
    cout << k;
    cout << "\n";

    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            cout << x[i][j];
            cout << " ";
        }
        cout << "\n";
    }
    return 0;

}

1 Ответ

0 голосов
/ 30 сентября 2018
#include <cstdlib>  // EXIT_FAILURE
#include <vector>
#include <fstream>
#include <iostream>

int main()
{
    char const * file_name{ "test.txt" };
    std::ifstream is{ file_name };

    if (!is.is_open()) {  // exit if the file couldn't be opened.
        std::cerr << "Couldn't open \"" << file_name << "\" for reading!\n\n";
        return EXIT_FAILURE;
    }

    int m, n, k;
    if (!(is >> m >> n >> k)) {  // whatever k might be.
        std::cerr << "Data error!\n\n";
        return EXIT_FAILURE;
    }

    std::vector<std::vector<int>> data(m, std::vector<int>(n)); // m rows, n cols

    for (int row = 0; row < m; ++row) {
        for (int col = 0; col < n; ++col) {
            if (!(is >> data[row][col])) {  // try to extract an integer
                std::cerr << "Data error!\n\n";  // give an error message and
                return EXIT_FAILURE;             // exit if it fails
            }
        }
    }

    for (auto const &row : data) {
        for (auto const &col : row) {
            std::cout << col << ' ';
        }
        std::cout.put('\n');
    }
}

Выход:

4 3
2 1
5 4
8 4
...