Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ТП_ЛабРаботы.doc
Скачиваний:
13
Добавлен:
28.09.2019
Размер:
716.8 Кб
Скачать

Операции с файлами

В заголовке 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 );

  }

Работа со строками

Строка в языке С/C++ представляет собой массив символов. Конец строки в массиве задается символом ‘\0’ (символ с кодом 0).

Примеры объявлений массивов символов:

char string[80];

char* title=”Diagram”;

Для определения длины строки используется функция int strlen( const char *string );:

char buffer[61] = "How long am I?";

int len = strlen( buffer );

Функция strcpy(char* str1,const char* str2) посимвольно копирует строку str2 в массив символов (строку) str1.

Функция strcat(char* str1,const char* str2) в конец строки str1 добавляет символы массива str2, включая завершающий ‘0’.

Функция strcmp(const char* str1,const char* str2) сравнивает в лексикографическом порядке 2 строки и возвращает целое число

<0 str1<str2,

0 str1==str2,

>0 str1>str2.

Функция _stricmp(string1,string2); сравнивает строки без учета регистра. Все символы считаются символами нижнего регистра.

Ввод строк с клавиатуры

Следующий фрагмент иллюстрирует достаточно надежный способ ввода с консоли значения текстовой строки (в данном случае массива Name):

char Name[30];

unsigned n; //Длина имени

char buf[80], *p; //Буфер ввода и указатель на начало строки

buf[0] = 30; // Ограничение на длину строки

р = cgets(buf); //Ввод в буфер

n = buf[l]; // Количество фактически введенных символов

if (n) // Если что-нибудь введено

{

strcpy(Name,p); // Копирование строки

}

Непосредственный ввод в буфер осуществляет функция cgets. Все остальные операторы обеспечивают надежность. Правила игры задает функция cgets. Она требует, чтобы предварительно в buf [0] было задано максимально допустимое количество сим­волов в строке. Она помещает в buf[l] количество фактически введенных сим­волов и возвращает указатель на начало строки. Сама строка размещается, начи­ная с buf[2], поэтому cgets присваивает переменной р адрес buf[2]. Далее в фрагменте выполняются следующие действия. Если количество введенных сим­волов строки не равно нулю, то она копируется из буфера в строку Name. Надежность ввода обеспечивается тем, что пользователь может нажимать любое количество любых клавиш (по одной), и при этом программа не будет вести себя непредсказуемым образом.

Преобразование строки в число

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

char s[81], c, s2[] = "15 12 14...";

int i;

float fp;

sscanf(s2, "%80s", s ); // max 80 character string

sscanf(s2, "%c", &c );

sscanf(s2, "%d", &i );

sscanf(s2, "%f", &fp );

Обратное преобразование можно выполнить с помощью функции sprintf. В отличие от printf первый параметр задает результирующую строку.