Return 1; // выход по ошибке, код ошибки 1
}
Fclose (fp); // закрыть файл норматьно
// работа с матрицей
}
Вывести матрицу в текстовый файл можно так же, как и на экран, только надо сначала открыть текстовый файл на запись, затем в двойном цикле использовать функцию fprintf вместо printf, и в конце закрыть файл (см. вывод одномерных массивов в файл).
Двоичные файлы
С двоичным файлом удобно работать тогда, когда данные записала (или будет читать)
другая программа и их не надо просматривать вручную. Основное преимущество этого способа— скорость чтения и записи, поскольку весь массив читается (или записывается) сразу единым блоком. При этом функциям fread и fwrite надо указать размер одного элемента массива и количество таких элементов, то есть M*N.
В программе, которая приведена ниже, матрица читается из двоичного файла, затем с ней
выполняются некоторые действия (они обозначены многоточием) и эта же матрица записывается в выходной файл.
#include <stdio.h>
const int M = 5; // числострок
const int N = 4; // числостолбцов
|
|
Main()
{
int total, A[M][N];
FILE *fp;
fp = fopen("input.dat", "rb");
total = fread(A, sizeof(int), M*N, fp); // чтениематрицы
fclose (fp);
if (total!= M*N) // обработкаошибки
{
printf("Не хватает данных");
Return 1; // выход по ошибке, код ошибки 1
}
// работа с матрицей
fp = fopen("output.dat", "wb"); // запись матрицы в файл
if (M*N!= fwrite(A, sizeof(int), M*N, fp))
printf("Ошибка записи в файл");
fclose (fp);
}
Для обработки ошибок используется тот факт, что функции fread и fwrite возвращают ко-
личество реально прочитанных (записанных) элементов, и если оно не равно заданному (M*N),то произошла ошибка.
Алгоритмы для работы с матрицами
Перебор элементов матрицы
В отличие от одномерных массивов, для перебора всех элементов матрицы надо исполь-
зовать двойной цикл. Ниже показано, как найти минимальный элемент в массиве и его индексы.Сначала считаем, что минимальным является элемент A[0][0] (хотя можно начать и с любого другого), а затем проходим все элементы, проверяя, нет ли где еще меньшего. Так же, как и для одномерного массива, запоминаются только индексы, а значение минимального элемента «вытаскивается» прямо из массива.
float A[M][N], i, j, row, col;
...
row = col = 0; // сначала считаем, что A[0][0] - минимальный
for (i = 0; i < M; i ++) // просмотр всех строк
for (j = 0; j < N; j ++) // просмотр всех столбцов
if (A[i][j] < A[row][col]) {
row = i; // запомнили новые индексы
col = j;
}
printf ("Минимальный элемент A[%d][%d]=%d",
row, col, A[row][col]);