Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
шпоры по ямп.docx
Скачиваний:
10
Добавлен:
01.04.2025
Размер:
162 Кб
Скачать
☆

7.Работа с файлами. Текстовый и двоичный режим.

Работа с файлами

Объявление файловой переменной – FILE *file;

Открытие файла – FILE *fopen(char *name, char *mode);

Проверка достижения конца файла – int feof(FILE *file);

Закрытие файла – int fclose(FILE *file);

FILE – специальная структура, объявленная в файле <stdio.h>, которая используется при работе с файлами. Для работы с файлом нужно объявить переменную FILE *<имя>.

Функция fopen используется для открытия файла. Первый параметр задаёт имя файла. Второй параметрmode задаёт требуемый тип доступа к файлу.

mode

действие

"r"

Открытие для чтения. Если файл не существует или не может быть найден, функция fopen возвращает признак ошибки.

"w"

Открытие для записи. Если файл существует, его содержимое уничтожается. Если файл не существует, он создаётся.

"a"

Открытие для добавления. Если файл не существует, он создаётся.

"r+"

Открытие для чтения и записи. Файл должен существовать.

"w+"

Открытие пустого файла для чтения и записи. Если файл существует, его содержимое уничтожается.

"a+"

Открытие для чтения и добавления. Если файл не существует, он создаётся.

Кроме того, к параметру mode могут быть добавлены символы t и b для задания текстового и двоичного режимов соответственно. По умолчанию используется текстовый режим.

В случае ошибки функция fopen возвращает значение NULL.

1.3.1. Текстовый режим

При вводе/выводе в текстовом режиме происходит преобразование между внешним представлением значения и внутренним (машинным) представлением этого значения.

Ввод одного символа – int getc (FILE *file);

Вывод одного символа – int putc (int c, FILE *file);

Ввод – int fscanf (FILE *file, char *format, ...);

Вывод – int fprintf(FILE *file, char *format, ...);

Ввод строки – char* fgets (char *line, int maxline, FILE *file);

Вывод строки – int fputs (char *line, FILE *file);

1.3.2. Двоичный режим

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

Ввод из двоичного файла – unsigned fread (void *buf, int bytes, int num, FILE *file);

Вывод в двоичный файл – unsigned fwrite (void *buf, int bytes, int num, FILE *file);

Функция fread читает из файла file в переменную buf num элементов, каждый размером bytes байт. Функция fwrite записывает в файл file из переменной buf num элементов, каждый размером bytes байт. Функции возвращают количество прочитанных/записанных элементов.

В двоичном режиме возможен прямой доступ к файлу: 

int fseek(FILE *file, long nbytes, int origin)

Данная функция смещает указатель в файле file на nbytes байт с позиции, определяемой параметромorigin. При этом параметр origin может принимать следующие значения:

SEEK_SET 0 – начало файла;

SEEK_CUR 1 – текущая позиция указателя;

SEEK_END 2 – конец файла.

Функция long ftell(FILE *file) возвращает текущую позицию указателя в файле file.

9.Строки в языке С++.

Строка – это последовательность (массив) символов (типа char), которая заканчивается специальным символом – признаком конца строки. Это символ записывается как '\0' (не путайте с символом переноса строки '\n') и равен 0. При вводе строки символ конца строки добавляется автоматически. Все функции работы со строками – и стандартные, и создаваемые программистом – должны ориентироваться на этот символ. Если требуется сформировать новую строку, то обязательно надо добавлять признак конца строки. Если этого не сделать, то при дальнейшей работе возникнут ошибки.

Строковым литералом называется последовательность символов, заключённых в двойные кавычки. В строковом литерале на один символ больше, чем используется при его записи – добавляется символ '\0'.

Тип строкового литерала есть «массив с надлежащим количество константных символов». Строковый литерал можно присвоить переменной типа char *. Это разрешается, потому что в предыдущих определениях С и C++ типом строкового литерала был char *. Однако изменение строкового литерала через такой указатель является ошибкой.

То, что строковые литералы являются константами, не только является очевидным, но и позволяет при реализации произвести значительную оптимизацию методов хранения и доступа к строковым литералам. Если же нужна строка, которую можно модифицировать, следует объявить и инициализировать массив символов.

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

const char *error_massage()

Поскольку мы не знаем, сколько в строке содержится символов, но знаем, что в конце стоит символ конца строки, цикл для обработки строки пишется следующим образом:

for (int i = 0; str[i] != '\0'; i++) { ... }.

Можно опустить сравнение с нулем, для C++ это будет эквивалентно:

for (int i = 0; str[i]; i++) { ... }.

Можно использовать указатели для обработки строк:

char str[50], *p;

...

for (p = str; *p; p++) { ... }.

Заголовки стандартных функций работы со строками хранятся в файле <string.h>. Основными из этих функций являются:

Определение длины строки – int strlen(const char *str);

Сравнение строк – int strcmp(const char *str1, const char *str2);

Копирование – char *strcpy(char *str1, const char *str2);

Конкатенация строк – char *strcat(char *str1, const char *str2);

Поиск символа в строке – char *strchr(const char *str, char c);

Поиск подстроки – char *strstr(const char *str1, const char *str2);

Ввод/вывод строки:

Ввод строки до пробела или другого разделителя – функция scanf с форматом %s;

Ввод строки, содержащей пробелы – char *gets (char *buffer);

Ввод строки из файла, n задаёт максимальное количество символов для ввода – char *fgets(char *string, int n, FILE *stream);

Вывод строки с форматированием – функция printf с форматом %s;

Вывод строки – int puts(const char *string);

Вывод строки в файл – int fputs(const char *string, FILE *stream);