Как заполнить массив данными из файла

285
19 декабря 2016, 20:10

Допустим есть файл со следующим содержанием

3
1 2 3
4 5 6
7 8 9

Я хочу написать программу, которая бы создавала массив 3х3 и заполняла его числами из файла (первая цифра - размер массива)

Помогите решить эту проблему. Вот мой нерабочий код:

#include <iostream>
#include <fstream>
#include <conio.h>
using namespace std;
int main()
{
    ifstream in("input.txt");
    if (!in)
    {
        cout << "File not found\n";
        _getch();
        return 1;
    }
    int size;
    in >> size;
    cout << "size = " << size << "\n";
    int** arr = new int*[size];
    for (int i = 0; i < size; i++)
        arr[i] = new int[size];
    char c = ' ';
    for (int i = 0; c != EOF; i++)
    {
        for (int j = 0; c != '\n'; j++)
        {
            if (c == ' ')
                do
                {
                    c = in.get();
                } while (c == ' ');
            arr[i][j] = c - '0';
            cout << arr[i][j];
            _getch();
        }
        cout << "\n";
    }
    _getch();
    return 0;
}

Он выводит -38 а потом зацикливается

Answer 1

Если Вас интересует в чем именно ошибка, приводящая к зацикливанию, то вот, простейшая же ошибка.

Первый же символ после 3 в input.txt это \n (а не пробел и не цифра, которые Вы ожидаете).

Далее от кода ньюлайна Вы отнимаете код ascii 0 и получаете -38 (а ожидали '1' - '0' == 1).

Потом выходите из внутреннего for (...; c != '\n'; ..., а вот из внешнего for Вам уже не выйти, т.к. переменная c нигде больше не меняется (во внутренний for Вы больше не попадете, т.к. значение переменной c перед ним == '\n` !!!).

Вот и зацикливание.

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

Для получения желаемого результата можно Ваши циклы переписать вот так:

for (int i = 0; in.good() && i < size; i++) {
  for (int j = 0; j < size; j++) {
    in >> arr[i][j];
    cout << arr[i][j] << ' ';
  }
  cout << '\n';
}
Answer 2

Ну если так как Вы хотите (чтобы разобраться), то вот:

#include <iostream>
#include <fstream>
int main()
{
    std::ifstream in("input.txt");
    if (in == 0)
    {
        std::cout << "Error! File not found!" << std::endl;
        system("pause");
        return 1;
    }
    int size;
    in >> size;
    int** arr = new int*[size];
    for (int i = 0; i < size; i++)
    {
        arr[i] = new int[size];
    }
    for (int i = 0; i < size; i++)
    {
        for (int j = 0; j < size; j++)
        {
            in >> arr[i][j];
        }
    }
    std::cout << "size = " << size << std::endl;
    for (int i = 0; i < size; i++)
    {
        for (int j = 0; j < size; j++)
        {
            std::cout << arr[i][j] << " ";
        }
        std::cout << std::endl;
    }
    system("pause");
    return 0;
}

Вы как-то по хитрому читаете сам массив, хотя его размер читаете нормально. Не стал разбираться где там ошибка.

А вообще, как и сказал @VladD, если вы пишете на C++, то используйте прелести STL и замените массивы на векторы. И ссылки Вам привели хорошие, где данные считываются буквально одной строкой.

READ ALSO
Не получается войти на FTP сервер

Не получается войти на FTP сервер

Здравствуйте! Пытаюсь написать FTP-клиент, столкнулся с трудностьюЧтобы зайти на ftp://87

266
IT компании для стажировки. [закрыто]

IT компании для стажировки. [закрыто]

Хочу пройти стажировку в более менее серьёзной компании, так как это будет полезно для профессионального роста, в большинстве требуются...

247
Подключить библиотеку ws2_32.lib

Подключить библиотеку ws2_32.lib

Делаю прогу, которая должна парсить сайтПри использовании конструкции

707
Асинхронные операции

Асинхронные операции

Есть ли асинхронные операции в с++? Или еще какие-нибудь средства

432