Консультация № 60555
29.10.2006, 14:31
0.00 руб.
0 2 2
Здравствуйте, Уважаемые.

Задача: решение матриц методом Зейделя. Матрицу нужно из файла *.tхt открыть. Например так: FILE *fp1; fp1 = fopen(„datei.txt“, „r“);
Ну и решить, соответственно. Так вот, раньше я всегда заранее задавал размеры матрицы, а как в таком случае поступить, если размер неизвестен? И каким образом описать эту матрицу в *.tхt, чтобы программа поняла, что это именно матрица?
Хотелось бы увидеть простенький пример(кусок кода).

Заранее Благодарю и Успехов.

Обсуждение

Неизвестный
29.10.2006, 16:56
общий
это ответ
Здравствуйте, Евсеев В. Н.!
Задать специальный формат файла.
Например в первых 8 байтах будут хранится количество строк и столбцов матрицы. По 4 байта (int) для параметра. А за ними элементы матрицы построчно.
Таким образом алгоритм считывании таков.
1) Прочитать первые 8 байт и записать их значения.
2) Динамически выделить память для матрицы.
3) С помощью стандартных циклов инициализировать элементы матрицы считывая значения из файла.

Код написан без проверки.

Приложение:
1)ifstream file(filename);int cols = 0, rows = 0;file.read((char*)&cols, sizeof(cols));file.read((char*)&rows, sizeof(rows));2)int ** matrix = 0;matrix = new int*[rows];for (int i = 0; i < rows; ++i) matrix[i] = new int[cols];3)int value = 0;int counter = 0;while (!file.eof()){ file.read((char*)&value, sizeof(value)); if (file.eof()) break; int row = rows / counter; int col = cols % counter; matrix[col][row] = value; ++counter;}char * err = "Not all items read in file.";char * suc = "All items read from file.";char * msg = counter == rows*cols ? suc : err;cout<<msg<<endl;
Неизвестный
29.10.2006, 18:53
общий
это ответ
Здравствуйте, Евсеев В. Н.!
Чтобы программа поняла, что файл - нужного типа,
можно в начале файла задавать некоторый "уникальный идентификатор",
как это в большинстве случаев и делается.
Например четыре символа: "DWTR" (dynamic matrix).
Чтобы хранить матрицы разных размерностей, после
идентификатора можно задавать размер по x и по y,
то есть два раза по четырехбайтовому числу.
Это все - заголовок файла, дальше - непосредственно данные матрицы.
Замечание.
Можно сразу условиться, какого типа будут элементы матрицы.
Например, int (четыре байта). Тогда никаких проблем.
Если же предусматривать, что тип элементов может быть разный,
то эту информацию тоже следует сохранять в заголовке файла.
Например, указывать размерность элемента в байтах и
тип элемента (вещественный/целый/беззнаковый целый).

Вот пример функций для загрузки и сохранения матрицы:

Приложение:
#include <stdio.h>#include <string.h>#include <conio.h>bool MLoadFromFile(char *FileName, int *Width, int *Height, int *Matrix){ FILE *f; f = fopen(FileName, "rb"); // именно "rb", т.к. открываем бинарный файл if(f==NULL) return false; char ID[5]; fread(ID,4,1,f); if(strncmpi(ID,"DWTR",4))// если идентификатор не совпадает { fclose(f); return false; } if( fread(Width,4,1,f)!=1 || fread(Height,4,1,f)!=1 || fread(Matrix,(*Width)*(*Height),4,f)!=4) { fclose(f); return false; } fclose(f); return true;}bool MSaveToFile(char *FileName, int Width, int Height, int *Matrix){ FILE *f; f = fopen(FileName, "wb"); if(f==NULL) return false; char ID[5]="DWTR"; fwrite(ID,4,1,f); fwrite(&Width,4,1,f); fwrite(&Height,4,1,f); fwrite(Matrix,Width*Height,4,f); fclose(f); return true;}
Форма ответа