Допустим есть файл со следующим содержанием
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 а потом зацикливается
Если Вас интересует в чем именно ошибка, приводящая к зацикливанию, то вот, простейшая же ошибка.
Первый же символ после 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';
}
Ну если так как Вы хотите (чтобы разобраться), то вот:
#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 и замените массивы на векторы. И ссылки Вам привели хорошие, где данные считываются буквально одной строкой.
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Здравствуйте! Пытаюсь написать FTP-клиент, столкнулся с трудностьюЧтобы зайти на ftp://87
Хочу пройти стажировку в более менее серьёзной компании, так как это будет полезно для профессионального роста, в большинстве требуются...
Делаю прогу, которая должна парсить сайтПри использовании конструкции