Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ТП лекции Раздел 4.doc
Скачиваний:
16
Добавлен:
28.09.2019
Размер:
2.56 Mб
Скачать

4.10.2. Функции файлового ввода-вывода.

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

Действия по открытию файла могут быть, например, такими:

char *fn = "test.txt"; //Имя файла

FILE *fp; // Указатель па файловую структуру

while ((fp=fopen (fn, "rt"))= =NULL

if (YesNo ("Файл не найден. Выход ?")) exit(l);

В этом фрагменте поиск файла и попытка его открыть с помощью функции fopen осуществляются в цикле while. Тем самым мы даем возможность пользова­телю как-то исправить положение, если попытка оказалась неудачной. Напри­мер, вставить дискету. Предполагается, что функция YesNo, предоставляющая пользователю меню из двух альтернатив и возвращающая сделанный выбор, со­здана и доступна. В случае успеха указателю типа FILE* присваивается значе­ние, возвращаемое библиотечной функцией fopen. Эта функция пытается найти и открыть файл с именем, задаваемым первым параметром, и связать поток ввода-вывода с указателем fp. Второй параметр определяет режим доступа. Он пред­ставляет собой константную строку текста, символы которой могут принимать следующие значения:

• r - открыть существующий файл только для чтения;

• r+ - открыть существующий файл для обновления (чтения и записи);

• w - создать для записи. Если файл с указанным именем уже существует, он будет разрушен;

• w+ - создать новый файл для обновления. Если файл уже существует, то он разрушается;

• а - открыть для записи в конец файла или создать для записи, если файл не существует;

• а+ —открыть (или создать) для чтения и записи, но в конец файла.

Чтобы указать компилятору, что данный файл открывается (создается) для чтения (записи) в текстовом формате (а не в двоичном), следует добавить сим­вол t, например "rt", "w+t" и т. д.

Режим обработки чисел (binary mode) отмечается символом b, например, а+b, wb и т. д.

В слу­чае успеха функция fopen возвращает указатель на вновь открытый поток. Если попытка оказалась неудачной, она возвращает NULL.

Библиотека ввода-вывода stdio.h имеет много других функций для более тонкой работы с файлами, например:

  • void rewind (FILE* stream); - переустанавливает указатель файла на начало потока;

  • int fseek(FILE *stream,long offset,int origin); - перемещает указатель в заданную позицию;

  • int fclose(FILE *stream); – закрывает файл;

  • char *fgets( char *string, int n, FILE *stream ); - чтение строки текста из потока, где

String- место размещения даны; N – максимальное количество символов, которые должны быть считаны; stream – указатель на структуру FILE;

  • int fgetc( FILE *stream ); - чтение символа из потока;

  • int fprintf( FILE *stream, const char *format [, argument ]...); - форматированный вывод в текстовый файл. Аналгогично printf, но первый параметр – указатель на файловую структуру;

  • int fputc( int c, FILE *stream ); - Вывод символа с в текстовый файл

  FILE *stream;

  char line[100];

  if( (stream = fopen( "fgets.c", "r" )) != NULL )

  {

     while (feof( stream ) = = 0)

{

if( fgets( line, 100, stream ) = = NULL)

        printf( "fgets error\n" );

     else

        printf( "%s", line);

}

     fclose( stream );

  }

Функции для работы с бинарным файлом

Чтение неформатированных данных из потока:

size_t fread( void *buffer, size_t size, size_t count, FILE *stream );

Параметры

Buffer – место для размещения данных

Size – размер единицы данных в байтах

Count – макс. кол-во единиц, которые должны быть прочитаны

Stream – указатель на структуру FILE.

Возвращает количество действительно прочитанных данных.

Запись неформатированных данных в файл:

size_t fwrite( const void *buffer, size_t size, size_t count, FILE *stream );

Параметры:

Buffer – указатель на место размещения записываемых данных

Size – размер единицы данных в байтах

Count – макс. кол-во единиц, которые должны быть записаны

Stream – указатель на структуру FILE.

Возвращает количество фактически записанных данных

Пример

/* FREAD.C: This program opens a file named FREAD.OUT and

* writes 25 characters to the file. It then tries to open

* FREAD.OUT and read in 25 characters. If the attempt succeeds,

* the program displays the number of actual items read.

*/

#include <stdio.h>

void main( void )

{

  FILE *stream;

  char list[30];

  int  i, numread, numwritten;

  /* Open file in text mode: */

  if( (stream = fopen( "fread.out", "w+t" )) != NULL )

  {

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

        list[i] = (char)('z' - i);

     /* Write 25 characters to stream */

     numwritten = fwrite( list, sizeof( char ), 25, stream );

     printf( "Wrote %d items\n", numwritten );

     fclose( stream );

  }

  else

     printf( "Problem opening the file\n" );

  if( (stream = fopen( "fread.out", "r+t" )) != NULL )

  {

     /* Attempt to read in 25 characters */

     numread = fread( list, sizeof( char ), 25, stream );

     printf( "Number of items read = %d\n", numread );

     printf( "Contents of buffer = %.25s\n", list );

     fclose( stream );

  }

  else

     printf( "File could not be opened\n" );

}

Результат

Wrote 25 items

Number of items read = 25

Contents of buffer = zyxwvutsrqponmlkjihgfedcb