Считывание матрицы из файла на C++
Пример кода на C++ с считыванием двумерного массива из целых чисел, разделенных пробелом, на C++.
Для того, чтобы считать из простого текстового файла матрицу, можно пойти несколькими путями. В примере ниже рассмотрен вариант, когда мы используем для хранения в программе классический динамический двумерный массив, а в файле не хранятся размеры матрицы в отдельной строке.
Принцип работы такой:
- Вначале обходим весь файл и считыванием через поток все целые числа. Тем самым узнаем число чисел в матрице.
- Затем посчитаем число пробелов до первого знака перевода на новую строку. Значит, число столбцов будет равно числу пробелов +1.
- Теперь мы знаем размеры матрицы и можем создать массив, и пройти по файлу, считывая данные в матрицу.
Программа является обучающим примером и содержит ряд недостатков, таких как:
- Можно сократить обход файла до одного, если, например, использовать списки.
- Считается, что между числами есть один пробел, а в конце строки пробела нет. А если будут лишние пробелы?
- Предполагаем, что в других строчках число чисел такое же, как и в первой.
Вот код самой программы:
#include #include 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 //Опять переходим в потоке в начало файла 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; in; 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; in; i++) delete[] x[i]; delete[] x; in.close();//под конец закроем файла > else //Если открытие файла прошло не успешно cout <"Файл не найден."; > system("pause"); return 0; >
Если у нас такой файл input.txt :
3 5 69 1 12 3 48 69 2
То получим вот такое при запуске программы:
КАК правильно считать матрицу из текстового файла?
мде. сколько раз уже писали — если C++, то нужно юзать fstream .
#include
#include
#include
using namespace std;
void main()
ifstream inp(«in.txt»);
int len;
inp >> len;
по аналогии с твоей задачей. если каждый символ в файле — элемент матрицы, то и считывай по 1 символу, т.е. по char, а потом конвертируй его в число.
а любая ф-ция чтения будет считывать число до разделительного символа(пробел, табуляция, перевод строки, конец файла)
04 июля 2010 года
26 / / 06.02.2009
сделал через fstream , но результат тот же.
#include «stdafx.h»
#include
#include
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
ifstream in(«in.txt»);
int n;
in >> n;
int mas[3][3];
04 июля 2010 года
16 / / 10.02.2010
Попробуй использовать Debug, прогони пошагово и посмотри что не так в твоем алогоритме (я так делал), а так сложно сказать , что не правильно, не понятно что на входе, а что должно быть на выходе.
04 июля 2010 года
452 / / 12.08.2009
а любая ф-ция чтения будет считывать число до разделительного символа(пробел, табуляция, перевод строки, конец файла)
я это для кого писал? стенке?
чтобы считать цифры из файла обычным способом(тот который дал я), нужно что бы между цифрами был пробел.
3
123
123
123
3
1 2 3
1 2 3
1 2 3
а если сильно надо считывать цифры содержащие по 1 разряду и не разделённые пробелами, то это нужно делать через считывание по 1 символу.
т.е. считывать по 1 символу(char) и переводить этот символ в число.
Попробуй использовать Debug, прогони пошагово и посмотри что не так в твоем алогоритме (я так делал), а так сложно сказать , что не правильно, не понятно что на входе, а что должно быть на выходе.
да всё тут понятно, он считывает из файла числа в не инициализированную матрицу, в файле 3 числа(не считая первого), а он считывает 9 чисел. отсюда и та фигня, что идёт на консоль
Как считать матрицу из файла си
как такое сделать? Т.е. создать текстовый файл, туда руками вбить матрицу, а потом чтобы программа корректно считала эту матрицу(целых чисел).
Re: Считать матрицу из файла
| От: | Кодт |
| Дата: | 16.04.07 12:11 |
| Оценка: |
Здравствуйте, <Аноним>, Вы писали:
А>как такое сделать? Т.е. создать текстовый файл, туда руками вбить матрицу, а потом чтобы программа корректно считала эту матрицу(целых чисел).
Аноним>
Самый тупой способ — это формат файла, в котором через пробел и/или перевод строки идут
— размеры матрицы (высота и ширина)
— элементы, скажем, построчно
Некрасиво отформатированный, но законный вид
3 4 11 12 13 14 21 22 23 24 31 32 33 34
То же самое красиво
3 4 11 12 13 14 21 22 23 24 31 32 33 34
int rows, cols; cin >> rows >> cols; your_matrix_set_size(rows, cols); for(int y=0; y!=rows; ++y) for(int x=0; x!=cols; ++x) < int elem; cin >> elem; your_matrix_set_at(x,y, elem); >
Более продвинутые варианты — использовать какой-нибудь язык разметки. Например, CSV (comma-separated values).
Считать числа из текстового файла в массив (Си)
Задача В текстовом файле INPUT.TXT записаны целые числа через пробел, возможно, в несколько строк. Сформировать список (массив) этих чисел. Решение Для начала, программа должна открыть файл INPUT.TXT для чтения, для этого используется функция fopen с опцией «r» . Если файл не удалось открыть — она возвращает нулевой указатель:
int main() < FILE* input = fopen("INPUT.TXT", "r"); if (input == 0) < printf("cant open file\n"); return 1; >// .
Теперь (если файл успешно открыт) можно считать его содержимое в массив. Для ввода целых чисел с файла в Си применяется функция fscanf опцией «%d» . Однако, нам нужно считать числа в массив, а значит — массив надо предварительно создать (с помощью функции malloc ). Создание массива — это выделение памяти и нужно знать сколько выделять памяти, но мы не знаем сколько чисел в файле — поэтому перед тем как создавать массив необходимо пройтись по всему файлу и посчитать в нем количество целых чисел. Напишем для этого вспомогательную функцию:
int numberCount(FILE* input) < fseek(input, 0, SEEK_SET); int counter = 0; while (true) < int value; if (fscanf(input, "%d", &value) == 1) counter++; if (feof(input)) break; >return counter; >
В начале своей работы функция устанавливает с помощью fseek указатель (позицию) чтения на начала файла — относительно начала ( SEEK_SET ) на ноль позиций. Далее — в цикле последовательно считывает числа с файла с помощью fscanf . После ввода каждого числа с помощью feof проверяет не был ли поднят флаг конца файла. Если файл кончился — выходит из цикла и возвращает значение счетчика. Теперь мы можем выделить память под массив в функции main:
int size = numberCount(input); int* numbers = (int*)malloc(sizeof(int) * size);
И считать числа с файла в массив, для этого еще раз проходимся по файлу и считываем с него заданное количество чисел:
void read_numbers(FILE* input, int size, int* numbers) < fseek(input, 0, SEEK_SET); for (int i = 0; i < size; ++i) < fscanf(input, "%d", &numbers[i]); >>
Также, напишем вспомогательную функцию для вывода содержимого массива на экран:
void print_array(int* numbers, int size) < for (int i = 0; i < size; ++i) < printf("%d ; ", numbers[i]); >printf("\n"); >