Перейти к содержимому

Как считать матрицу из файла си

  • автор:

Считывание матрицы из файла на 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"); >

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *