Пример кода на C++ с считыванием двумерного массива из целых чисел, разделенных пробелом, на С++.
Для того, чтобы считать из простого текстового файла матрицу, можно пойти несколькими путями. В примере ниже рассмотрен вариант, когда мы используем для хранения в программе классический динамический двумерный массив, а в файле не хранятся размеры матрицы в отдельной строке.
Принцип работы такой.
- Вначале обходим весь файл и считыванием через поток все целые числа. Тем самым узнаем число чисел в матрице.
- Затем посчитаем число пробелов до первого знака перевода на новую строку. Значит, число столбцов будет равно числу пробелов +1.
- Теперь мы знаем размеры матрицы и можем создать массив, и пройти по файлу, считывая данные в матрицу.
Программа является обучающим примером и содержит ряд недостатков, таких как:
- Можно сократить обход файла до одного, если, например, использовать списки.
- Считается, что между числами есть один пробел, а в конце строки пробела нет. А если будут лишние пробелы?
- Предполагаем, что в других строчках число чисел такое же, как и в первой.
Вот код самой программы:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 |
#include <fstream> #include <iostream> using namespace std; int main() { setlocale(LC_ALL, "RUSSIAN"); //Создаем файловый поток и связываем его с файлом ifstream in("input.txt"); if (in.is_open()) { //Если открытие файла прошло успешно //Вначале посчитаем сколько чисел в файле int count = 0;// число чисел в файле int temp;//Временная переменная while (!in.eof())// пробегаем пока не встретим конец файла eof { in >> temp;//в пустоту считываем из файла числа count++;// увеличиваем счетчик числа чисел } //Число чисел посчитано, теперь нам нужно понять сколько //чисел в одной строке //Для этого посчитаем число пробелов до знака перевода на новую строку //Вначале переведем каретку в потоке в начало файла in.seekg(0, ios::beg); in.clear(); //Число пробелов в первой строчке вначале равно 0 int count_space = 0; char symbol; while (!in.eof())//на всякий случай цикл ограничиваем концом файла { //теперь нам нужно считывать не числа, а посимвольно считывать данные in.get(symbol);//считали текущий символ if (symbol == ' ') count_space++;//Если это пробел, то число пробелов увеличиваем if (symbol == '\n') break;//Если дошли до конца строки, то выходим из цикла } //cout << count_space << endl; //Опять переходим в потоке в начало файла in.seekg(0, ios::beg); in.clear(); //Теперь мы знаем сколько чисел в файле и сколько пробелов в первой строке. //Теперь можем считать матрицу. int n = count / (count_space + 1);//число строк int m = count_space + 1;//число столбцов на единицу больше числа пробелов double **x; x = new double*[n]; for (int i = 0; i<n; i++) x[i] = new double[m]; //Считаем матрицу из файла for (int i = 0; i < n; i++) for (int j = 0; j < m; j++) in >> x[i][j]; //Выведем матрицу for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) cout << x[i][j] << "\t"; cout << "\n"; } for (int i = 0; i<n; i++) delete[] x[i]; delete[] x; in.close();//под конец закроем файла } else { //Если открытие файла прошло не успешно cout << "Файл не найден."; } system("pause"); return 0; } |
Если у нас такой файл input.txt:
1 2 3 |
3 5 69 1 12 3 48 69 2 |
то получим вот такое при запуске программы.