- •Библиотеки и ввод-вывод данных
- •Ввод-вывод данных. Основные понятия
- •Классификация функций ввода-вывода верхнего уровня
- •Обработка ошибок ввода-вывода
- •Открытие, закрытие и удаление файлов
- •Бесформатный ввод-вывод данных текстовых файлов Посимвольный ввод-вывод данных
- •Построчный ввод-вывод данных
- •Построчный вывод данных
- •Форматный ввод-вывод данных текстовых файлов Форматный ввод данных
- •Форматы ввода данных
- •Форматный вывод данных
- •Форматы вывода данных
- •Форматный вывод арифметических данных
- •Форматный вывод символьных и строковых данных
- •Ввод-вывод записей
- •Ввод записей
- •Вывод записей
- •Дополнительные возможности ввода-вывода данных
Ввод-вывод записей
Функции Си позволяют обмен данными с файлами последовательной организации, состоящими из записей фиксированной длины. При этом за одно выполнение одной функции ввода-вывода данных записями пересылается одна и более записей. Записи представляются в виде переменной любого типа, кроме файлового. Переменная записи определяется программистом.
При вводе-выводе данных записями надо использовать бинарные режимы доступа в операторах открытия файлов: “wb”, “rb”, “ab+” …
Ввод записей производится функцией fread, вывод – функцией fwrite. Форматных преобразований при пересылке данных не производится.
Ввод записей
Прототип функции fread:
int fread(void* ptr, unsigned size, int k, FILE* stream);
где ptr – указатель переменной любого типа, в которую читается запись;
size – длина записи в байтах;
k – количество считываемых записей размером size;
stream – имя указателя, связанного с файлом для чтения.
Функция fread читает k записей размером size из входного потока stream и помещает их в область памяти, на которую указывает ptr (например, массив или структуру). После этого указатель файла, связанный с потоком stream, увеличивается на количество прочитанных байтов, равное size* k.
Возвращаемое функцией fread значение - количество прочитанных записей, которое может быть и меньше k, если при чтении произошла ошибка или встретился конец файла до того, как были прочитаны k записей.
Для анализа конца файла можно использовать результат, возвращаемый функцией fread:
если результат равен 1, запись считана (например, условие оператора while истинно, продолжается выполнение тела цикла);
если результат равен 0, запись не считана (так как обнаружен, например, конец файла, выполнение цикла завершается);
Вывод записей
Прототип функции fwrite:
int fwrite( const void* ptr, unsigned size, int k, FILE* stream);
где ptr – указатель переменной любого типа, из которой запись выводится в файл (квалификатор const указывает, что переменная не может менять своего значения);
size – длина записи в байтах;
k – количество выводимых записей размером size;
stream – имя указателя, связанного с файлом для записи.
Функция fwrite выводит k записей из переменной, на которую указывает ptr, в файл, связанный с указателем stream. Указатель файла, связанный с потоком stream, увеличивается на количество выведенных байтов, равное size* k.
Возвращаемое функцией fwrite значение - количество записей, реально помещенных в файл. Оно может быть меньше k, если имела место ошибка.
Пример Использование функции fwrite для вывода записями в файл
#include <stdio.h>
FILE*frz;
struct {
char nb;
char ts[5];
} st={'1',"asdfg"};
int main(void)
{
frz=fopen("9.dat","wb");
fwrite(&st,sizeof(st),1,frz);
fclose(frz);
return 0;
}
Пример Использование функций fwrite и fread для вывода записями в файл и чтения записями из файла
#include <stdio.h>
char arr[5];
int main()
{ FILE*frz=fopen("9.dat","wb+");
int rep, count;
for(count='a'; count!='f'; count++)
{
arr[0]=count;
printf("\n%u",arr[0]);
fwrite(arr,sizeof arr,1,frz);}
rewind(frz);
count=0;
do{
rep=fread(arr,sizeof arr,1,frz);
printf("%c",arr[0]);
if (rep<1)
break;
count++;}
while(1);
printf("count=%d",count);
fclose(frz);
return 0;}