Чтение матрицы в 2D массив в C / C ++

0

Каков самый простой способ чтения/ввода матрицы чисел в массив в C++?

Это содержимое файла (размеры неизвестны):

283 278 284 290 290 286 273 266 266 266 261 252 246
382 380 379 381 382 379 384 387 385 382 376 365 357 
285 282 281 279 276 273 272 264 255 255 247 243 237 
196 190 186 183 183 180 179 186 191 195 195 188 187 
245 237 226 220 221 222 225 228 234 245 252 264 272 
283 278 284 290 290 286 273 266 266 266 261 252 246

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

MATRIX[i][j] = MATRIX[i][j] + rand()-RAND_MAX/2;

Что включить в цикл if для чтения матрицы?

#include <iostream>
#include <fstream>

ifstream pFile;
pFile.open("test.txt");

if (pFile.is_open())
{
    // SOMETHING HERE!!!!!??
}
else
{
    printf("Error reading the file!\n");
    return 1;
}
  • 4
    Используйте std::vector<std::vector<int> > . Вы избавите себя от многих неприятностей.
  • 0
    что ты уже испробовал? Здесь уже есть сотни тем о том, как читать из файлов.
Теги:
arrays
input
matrix

3 ответа

1

Сначала, как и другие, используйте std::vector<std::vector<int>>. Это упростит ситуацию.

#include <vector>
typedef std::vector<int> IntVector;
typedef std::vector<IntVector> IntVector2D;

Таким образом, наш тип - IntVector2D. (Я определил одномерный вектор, который будет использоваться позже)

Затем мы хотим настроить цикл, который читает по одной строке за раз, анализирует строку и сохраняет int, найденный в строке, в одной строке матрицы. Чтобы сделать это, мы можем прочитать строку в строке и использовать istringstream для синтаксического анализа.

Наконец, для каждой сохраненной строки мы применяем изменения к каждому элементу строки в соответствии с вашей функцией случайных чисел.

Итак, вот пример всего этого:

#include <fstream>
#include <vector>
#include <string>
#include <sstream>
#include <algorithm>
#include <iterator>
#include <iostream>

typedef std::vector<int> IntVector;
typedef std::vector<IntVector> IntVector2D;

using namespace std;

// random number function to apply
int ApplyRand(int num)
{ return num + rand() - RAND_MAX/2; }

void OutputMatrix(const IntVector2D& m)
{
    cout << "\n";
    IntVector2D::const_iterator it = m.begin();
    while (it != m.end())
    {
        copy(it->begin(), it->end(), ostream_iterator<int>(cout, " "));
        cout << "\n";
        ++it;
    }
}

// Transform the numbers in the matrix
void TransformMatrix(IntVector2D& m)
{
    IntVector2D::iterator it = m.begin();
    while (it != m.end())
    {
        transform(it->begin(), it->end(), it->begin(), ApplyRand);
        ++it;
    }
}

int main()
{
    IntVector2D matrix;
    ifstream pFile("test.txt");
    string s;

    while ( std::getline(pFile, s) )
    {
        // create empty row on back of matrix
        matrix.push_back(IntVector());
        IntVector& vBack = matrix.back();

        // create an istringstream to parse
        istringstream ss(s);

        // parse the data, adding each number to the last row of the matrix
        copy(istream_iterator<int>(ss), istream_iterator<int>(), back_inserter(vBack));
    }
    // output the matrix
    OutputMatrix(matrix);

    // Apply rand to each number
    TransformMatrix(matrix);

    // output the updated matrix 
    OutputMatrix(matrix);
}

Вывод:

283 278 284 290 290 286 273 266 266 266 261 252 246
382 380 379 381 382 379 384 387 385 382 376 365 357
285 282 281 279 276 273 272 264 255 255 247 243 237
196 190 186 183 183 180 179 186 191 195 195 188 187
245 237 226 220 221 222 225 228 234 245 252 264 272
283 278 284 290 290 286 273 266 266 266 261 252 246

-16059 2362 -9765 10407 3076 -373 -4632 13241 10845 8347 -10417 12014 7144826 
-6042 -15513 -13007 -4059 -11177 -10563 16395 -1394 -12099 -15854 -15726 -3644
1323 2615 3616 3791 -10660 5616 -1340 -4581 -14259 3784 9531 10159 889
-6293 12510 7614 15122 14133 1470 -11540 -1056 -8481 12065 -9320 9352 11448
16524 16611 3880 -3304 -7439 -6420 11371 -15377 -3833 -13103 6059 -14277 -15823
14006 -7065 -7157 3171 6555 11349 7695 -227 -9388 8253 -772 -1125 14964

Обратите внимание на использование std::copy для извлечения элементов из istringstream и back_inserter, который отвечает за вызов push_back в последней строке матрицы.

Кроме того, использование std::transform позволяет нам вызвать функцию для каждого элемента, "преобразуя" элемент из исходного значения в измененное значение, используя ApplyRand в качестве функции для этого преобразования.

0

Прежде всего, мы объявляем вектор векторов, чтобы сохранить нашу матрицу в. Обратите внимание, что преимущество векторов над массивами, если вы не знаете измерения, с которыми работаете, состоит в том, что вам не нужно беспокоиться о том, чтобы изменить размер вашего структура данных, если у вас заканчивается пространство. Вот почему мы используем векторы вместо массивов. После этого мы используем stringstream для чтения всех целых чисел из ввода. В цикле while мы продолжаем, пока не выйдет еще одна строка (getline() возвращает true, если больше нет строк). На каждом шаге мы читаем строку из ввода (независимо от того, как долго это происходит, мы читаем ее полностью), тогда мы выделяем целые числа строк и помещаем их в вектор, используя строковый поток. Затем добавим этот вектор к нашему векторному вектору матрицы. Я написал этот код:

#include <iostream>
#include <string>
#include <sstream>
#include <vector>
#include <fstream>
using namespace std;

int main () {

    fstream cin;
    cin.open("input.txt");

    string s;
    vector <vector <int> > matrix;

        while (getline(cin, s)) {

        stringstream input(s);

        int temp;
        vector <int> currentLine;
        while (input >> temp)
            currentLine.push_back(temp);

        matrix.push_back(currentLine);

        }

        for (unsigned int i = 0; i < matrix.size(); i++) {
            for (unsigned int j = 0; j < matrix[i].size(); j++)
                cout << matrix[i][j] << " ";
            cout << endl;
        }

    return 0;
}

И результат - именно то, что вы хотите. Обратите внимание, что первая строка не видна, и мне пришлось прокручивать ее вверх, чтобы убедиться в этом, но убедитесь, что она есть. Попробуйте. Здесь вывод: Изображение 174551

  • 0
    Спасибо, это прекрасно! (: Можете ли вы объяснить это немного, пожалуйста.
  • 0
    Добро пожаловать @Vito посмотреть мое обновление. Если есть что-то, чего ты не можешь понять, скажи мне. Если это сработало для вас, пожалуйста, примите мой ответ. :)
0

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

    std::vector<std::vector<int> > matrix;
    std::string line;
    int value;

    // read in matrix
    std::ifstream file("path/to/file.txt");
    while(std::getline(file, line)) {
            std::vector<int> row;
            std::istringstream iss(line);
            while(iss >> value){
                    row.push_back(value);
            }
            matrix.push_back(row);
    }

Ещё вопросы

Сообщество Overcoder
Наверх
Меню