Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции_по_пяву_4.doc
Скачиваний:
101
Добавлен:
15.03.2015
Размер:
1.29 Mб
Скачать
      1. Блоковый ввод – вывод

Блоковый ввод – вывод обеспечивается функциями fread() и fwrite().

Объявление функции fwrite() имеет следующий вид:

#include<stdio.h>

size_t fwrite(const void* ptr, size_t n, size_t nmemb, FILE* stream);

Функция fwrite() помещает до nmemb элементов (блоков), каждый из которых размером size, из массива адресуемого указателем ptr, в поток, на который установлен указатель stream.

Функция fwrite() возвращает число успешно записанных элементов (блоков). Это значение может оказаться меньше, чем nmemb, если имеет место ошибка.

#include<stdio.h>

size_t fread(void* ptr, size_t n, size_t nmemb, FILE* stream);

Функция fwrite() читает до nmemb элементов (блоков), каждый из которых размером size, в массив адресуемого указателем ptr, из потока, на который установлен указатель stream.

Функция fread() возвращает число успешно прочитанных элементов (блоков). Это значение может оказаться меньше, чем nmemb, если имеет место ошибка или обнаружен конец файла.

      1. Примеры решенных задач

Пример 1 Табулирование функции с записью результатов на диск.

Постановка задачи. Табулировать функцию y = в n равноостоящих точках, начиная от значения x = xn вплоть до x = xk. Результаты табулирования записать в текстовый файл.

Решение.

Один из возможных вариантов решения рассматриваемой задачи имеет следующий вид.

/* Файл table.c. */

#include<stdio.h>

#include<conio.h>

#include<stdlib.h>

void table_file(double xn, double xk, int n, FILE* out);

int main(void)

{

int n;

double x1, x2;

FILE* out_file;

clrscr();

printf(“Количество расчетных точек = ”);

scanf(“%d”, &n);

printf(“Начальное значение аргумента=”);

scanf(“%lf”, &x1);

printf(“Конечное значение аргумента=”);

scanf(“%lf”, &x2);

if((out_file = fopen(“out_file.txt”, “w”) == NULL))

{

printf(“Не могу открыть файл out_file.txt\n”);

exit(1);

}

table_file(x1, x2, n, out_file);

fclose(out_file);

printf(“Файл сформирован\n”);

getch();

return 0;

}

void table_file(double xn, double xk, int n, FILE* out)

{

double x, dx;

int i ;

fprintf(out, “%5s%15s%15s\n”, “Номер”, “Аргумент”, “Функция”);

dx = (xk - xn) /(n - 1);

x = xn;

for(i = 1; i <= n; i++)

{

fprintf(out, “%5d%15.2f%15.2f\n”, i, x, x * x);

x += dx;

}

}

Пример 2.Запись содержимого двух массивов в текстовый файл

Постановка задачи. Имеются два массива, содержащие числа типа double. Записать содержимое этих массивов в текстовый файл. Вывод организовать в виде таблицы, снабженной заголовком. Таблица должна содержать три колонки. В первой колонке должен выводиться порядковый номер элемента, в двух других элементы массивов. В заголовке следует указать имена выводимых массивов.

Решение

Оформим решение данной задачи в виде функции. Эта функция должна иметь шесть параметров. Первый из них должен служить для передачи в функцию файлового указателя на файл, в который будет выполняться вывод. Два параметра необходимы для передачи массивов, значения которых следует выводить в файл. Затем еще два параметра необходимы для передачи в функцию имен выводимых массивов. Наконец, последний параметр должен служить для передачи в функцию количества выводимых элементов массива.

#include<stdio.h>

void save_arrays(FILE* out, double* arr1, double* arr2,

char* name1, char* name2, int num)

{

int i;

fprinf(out, "%6s%15s%15s\n", "НОМЕР", name1, name2);

for(i = 0; i < n; i++)

{

fprinf(out, "%6d%15.2f%15.2f\n", i, arr1[i], arr2[i]);

}

}

Пример 3.Чтение из таблицы, хранящейся в файле, двух числовых массивов

Постановка задачи. В текстовом файле имеется таблица, в которой хранится содержимое двух массивов. Таблица содержит три колонки и снабжена заголовком, который находится в первой строке файла. В первой колонке представлен порядковый номер элемента, в двух других - элементы массивов.

Оформим решение данной задачи в виде функции. Эта функция должна иметь три параметра. Первый из них должен служить для передачи в функцию файлового указателя на файл, из которого будет выполняться чтение. Два других параметра необходимы для передачи массивов, в которые будет выполняться чтение данных. Количество прочитанных элементов массивов функция должна вернуть в качестве возвращаемого значения. Для чтения файла будет использоваться функция fgets из стандартной библиотеки языка C. Основу алгоритма функции должен составлять итерационный цикл чтения файла. До входа в цикл необходимо прочитать заголовок таблицы, а в его теле последовательно читать строки таблицы. Строка, полученная в результате чтения заголовка таблицы, в программе не используется.

#include<stdio.h>

/* Чтение массивов */

int load_arrays(FILE* in, double* arr1, double* arr2)

{

int count = 0;

char buf[255];

/* Чтение заголовка таблицы */

fgets(buf, sizeof(buf), in);

while(fgets(buf, sizeof(buf), in) != NULL)

{

sscanf(buf, "%*d%lf%lf", arr1 + couПримерnt, arr2 + count);

count++;

}

return count;

}

Пример 4. Обработка числовой матрицы, хранящейся на диске

Постановка задачи. Числовая матрица находится в текстовом файле. Первая строка файла содержит данные о размере матрицы. Вычислить сумму элементов в каждой строке матрицы.

Решение

#include<stdio.h>

#include<stdlib.h>

void summa_row_in_text_file(FILE* in, FILE* out)

{

int nrow;

int ncol;

int row;

int col;

double s, x;

fscanf(in, "%d%d", &row, &col);

for(row = 0; row < nrow; row++)

{

s = 0;

for(col = 0; col < ncol; col++)

{

fscanf(in, "%lf", &x);

s += x;

}

fprintf(out, "%10.3f\n", s);

}

}