Чтение данных двумерного массива из текстового файла - PullRequest
0 голосов
/ 19 апреля 2020

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

У меня есть текст, заполненный input.txt, содержимое которого выглядит как-то строки:

4 4
1.0 2.0 3.0 4.0
5.0 6.0 7.0 8.0
9.0 10.0 11.0 12.0
13.0 14.0 15.0 16.0

Где первая строка определяет размеры 2D-массива.

Итак, используя fstream, я нашел, как извлечь строки из строки файла с помощью линия, но моя проблема с извлечением отдельных данных. Я попытался использовать substr и обнаружил, что это становится настоящей головной болью, когда вы имеете дело с двойными числами, которые могут иметь переменное количество десятичных разрядов.

Точно так же, поскольку это для вводного курса программирования, векторы запрещены, что я обычно использовал для таких вещей (на самом деле, по этой причине я должен повторить задание).

Поэтому, используя массивы C, как мне извлечь эту информацию из input.txt?

Мой код для извлечения из первой строки:

int m, n;
if (inputFile.good()) {
    std::string line;
    std::getline(inputFile, line);

    std::string sizeX = line.substr(0, 1);
    std::string sizeY = line.substr(2, 1);

    m = stoi(sizeX);
    n = stoi(sizeY);
}

Но это также не будет работать, если размеры массива будут больше 9.

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

Кроме того, методы на основе токенов, которые я видел, такие как:

int a, b;
while (infile >> a >> b)
{
    // process pair (a,b)
}

, не объясняют, как вы могли бы сделать это для переменного числа элементов в строке.

Заранее спасибо

1 Ответ

1 голос
/ 19 апреля 2020

Просто используйте >> в al oop. Если вы хотите читать строку за раз, это сделает жизнь намного сложнее, если использовать >>, то пропустите все пробелы, включая пробелы и переводы строк.

ifstream infile("input.txt");
int size;
infile >> size;
double **arr = ... // allocate array based on size
for (int i = 0; i < size; ++i)
    for (int j = 0; j < size; ++j)
        infile >> arr[i][j];

Я предположил, что вы знаете, как распределить C массив стилей. И я также не проверил ошибки, которые в реальной программе вы должны включить. Но, надеюсь, я проиллюстрировал, как читать значения в массив.

...