Краткие теоретические сведения. Специальные функции обмена с файлами имеются только для символьного и целого типов данных

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

Функция записи блока данных имеет прототип

int fread(void*buf, int bytes, int n, FILE*fptr);

Здесь

buf – указатель на адрес данных, записываемых в файл;

bytes – длина в байтах одной единицы записи (блока данных);

n – число блоков, передаваемых в файл;

fptr – указатель на поток.

Если запись выполнилась благополучно, то функция возвращает число записанных блоков (значение n).

Функция чтения блока данных из файла имеет прототип

int fwrite(void*buf, int bytes, int n, FILE*fptr);

Пример 4.следующая программа организует запись блоков в файл строки (символьного массива), а также чтение и вывод на экран записанной информации.

# include <stdio.h>

# include <string.h>

void main()

{ FILE *stream;

char msg[ ]=”this is a test”;

char buf[20];

if (( stream=fopen(“DUMMY.FILL”,”w+”))==NULL)

{puts(“Не могу открыть файл \n”); return;}

// Запись строки в файл

fwrite(msg, strlen(msg)+1, 1, stream);

// Установка указателя на начало файла

fseek(stream, 0, SEEK_SET);

// Чтение строки из файла

fread(buf, strlen(msg)+1, 1, stream);

printf(“%s \n”,buf);

fclose(stream);

}

В этой программе поток открывается в режиме w+ (создание для записи с последующим чтением). Поэтому закрывать файл после записи не потребовалось. Новым элементом данной программы по сравнению с предыдущими является использование функции установки указателя потока в заданную позицию. Ее формат

int fseek(указатель_на поток, смещение, начало_отсчета);

Начало отсчета задается одной из констант, определенных в файле stdio.h:

SEEK_SET (имеет значение 0) – начало файла;

SEEK_CUR (имеет значение 1) – текущая позиция;

SEEK_END (имеет значение 2) – конец файла.

Смещение определяет число байт, на которое надо сместить указатель относительно заданного начала отсчета. Смещение может быть как положительным, так и отрицательным числом. Оба параметра имеют тип long.

Форматный обмен с файлами

С помощью функции форматного вывода можно формировать на диске текстовый файл с результатами вычислений, представленными в символьном виде. В дальнейшем этот файл может быть просмотрен на экране, распечатан на принтере, отредактирован с помощью текстового редактора. Общий вид функции форматного вывода:

int fprintf (указатель_на_поток, форматная_строка, список_переменных);

Использовавшаяся нами ранее функция printf () для организации вывода на экран является частным вариантом функции fprintf (). Функция printf () работает лишь со стандартным потоком stdin, который всегда связывается системой с дисплеем. Не будет ошибкой, если в программе вместо printf () написать fprintf (stdin, …).

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

Пример 5.Составим программу, по которой будет рассчитана и записана в файл таблица квадратных корней для целых чисел от 1 до 10. Для контроля эта же таблица выводится на экран.

//Таблица квадратных корней

#include <stdio.h>

#include <iostream.h>

#include <math.h>

voidmain()

{ FILE *fp;

intx;

fp = fopen(“test.dat”, “w”);

//Вывод на экран и в файл шапки таблицы

printf(“\t Таблица квадратных корней \n”);

fprintf(fp, “\t Таблица квадратных корней \n ”);

printf(“\t x\t\tsqrt(x) \n”);

fprintf(fp, “\t x\t\tsqrt(x) \n ”);

\\Вычисление и вывод таблицы квадратных корней

\\на экран и в файл

for(x = 1; x<=10; x++)

{ printf(“\t%f\t%f\n”, float(x), sqrt(float(x)));

fprintf(fp, “\t%f\t%f\n”, float(x), sqrt(float(x)));

}

fclose(fp); }

Форматный ввод из текстового файла осуществляется с помощью функции fscanf (), общий формат которой выглядит следующим образом:

int fscanf(указатель_на_поток, форматная_строка, список_адресов_переменных);

Данной функцией удобно пользоваться в тех случаях, когда исходные данные заранее подготавливаются в текстовом файле.

В следующем примере числовые данные из файла test.dat, полученного в результате выполнения предыдущей программы, вводятся в числовые массивы x и y. Для контроля значения элементов массивов выводятся на экран. Предварительно с помощью текстового редактора в файле test.dat удаляются две первые строки с заголовками. В результате в файле останутся только числа.

Пример 6.

\\Ввод чисел из файла

#include <stdio.h>

#include <iostream.h>

#include <math.h>

voidmain()

{ FILE *fp;

inti;

floatx [10], y [10];

fp = fopen(“test.dat”,”r”);

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

{ fscanf(fp, “%f%f”, &x[i], &y[i]);

printf(“%f %f\n”, x[i], y[i]);

}

fclose(fp);

}

Порядок выполнения работы

1. Изучить теоретические сведения.

2. Выполнить задание.

Задания для выполнения

1. Набрать и выполнить примеры.

2. Написать аналогичные программы для таблицы умножения целых чисел от 2 до 10.

ЛАБОРАТОРНАЯ РАБОТА № 32