- •Лабораторная работа 11
- •Постановка задачи
- •Варианты заданий
- •Методические указания по выполнению лабораторной работы
- •Справочные материалы
- •Понятие потока
- •Текстовый поток
- •Двоичный поток
- •Файлы в языке си
- •Указатель файла
- •Функция fopen
- •Функция fclose
- •Построчный ввод – вывод
- •Блоковый ввод – вывод
- •Примеры решенных задач
- •Пример 1. Табулирование функции с записью результатов на диск
- •Постановка эадачи
- •Решение
- •Пример 2. Запись содержимого двух массивов в текстовый файл
- •Постановка задачи
- •Решение
- •Пример 3. Чтение из таблицы, хранящейся в файле, двух числовых массивов
- •Постановка задачи
- •Решение
- •Пример 4. Вывод содержимого текстового файла на экран дисплея с проверкой на наличие ошибок.
- •Пример 5. Числовая матрица находится в текстовом файле. Первая строка файла содержит данные о размере матрицы. Вычислить сумму элементов в каждой строке матрицы.
- •Пример 6. Сумма чисел в текстовом файле
- •Пример 7.
- •Контрольные вопросы и задачи для самостоятельной работы
Пример 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 + count, arr2 + count);
count++;
}
return count;
}
Пример 4. Вывод содержимого текстового файла на экран дисплея с проверкой на наличие ошибок.
#include<stdio.h>
#include<stdlib.h>
void display_file(FILE* in)
{
char buf[255];
while(fgets(buf, sizeof(buf), in) != NULL)
{
fgets(buf, sizeof(buf), in);
}
if(ferror(in))
{
printf("Ошибка чтения файла\n");
exit(1);
}
}