- •Тема 7. Строки, потоки, файлы.
- •1. Строки.
- •1.1. Создание строк
- •1.2. Присваивание строк
- •1.3. Сравнение строк
- •1.4. Длина строки
- •1.5. Преобразования строк
- •2. Файлы и потоки.
- •2.1. Понятие файла и потока.
- •1.6. Объединение строк
- •1.7. Другие функции для работы со строками
- •2.2. Указатель на файл, открытие файла, обработка ошибок, закрытие файла, изменение режима открытия.
- •2.3. Чтение из файла и запись в файл
- •2.4. Позиционирование в потоке.
- •2.5. Контроль исполнения потоковых операций.
1.6. Объединение строк
Сначала простой вопрос – каков результат выполнения следующего кода:
char str1[10]="Hello";
char str2[10]="World!";
char* str3;
str3=str1+str2;
Если ответ – ошибка на этапе компиляции, материал изложенный в статье вы усвоили (или знали это раньше). Если же вы полагаете, что в str3 будет хранится строка "Hello world!", то вероятно, мои предыдущих объяснений оказалось недостаточно. Нельзя складывать указатели (и имена массивов).
Для объединения строк следует использовать функции.
Есть две специальные функции (библиотека string.h):
char* strcat(char* dest, const char* source)
char* strncat(char* dest, const char* source, size_t size)
Эти функции добавляют к строке, на которую указывает dest, символы из строки source. Первая версия добавляет все символы до нуль-терминатора, вторая – максимум size символов. Результирующая строка завершается нуль-терминатором.
Кроме того, можно воспользоваться общей функцией sprintf так:
char str1[]="Hello ";
char str2[]="world";
char str3[]="!";
char str4[13];
sprintf(str4, "%s%s%s", str1, str2, str3);
Этот вариант удобнее, если нужно объединить более двух строк. Однако к его недостаткам относится типонебезопасность.
1.7. Другие функции для работы со строками
Функция |
Прототип и краткое описание действий |
strchr |
char *strchr(char *str, int c); Ищет в строке str первое вхождение символа с, возвращает указатель на первое вхождение. |
strcspn |
int strcspn(char *str1, char *str2); Определяет длину первого сегмента строки str1, содержащего символы, не входящие в строку str2. |
strspn |
int strspn(char *str1, char *str2); Определяет длину первого сегмента строки str1, содержащего только символы, входящие в строку str2. |
strlwr |
char *strlwr(char *str); Преобразует символы верхнего регистра в строке в соответствующие символы нижнего регистра. |
strupr |
char *strupr(char *str); Преобразует символы нижнего регистра в строке в соответствующие символы верхнего регистра. |
strset |
char *strset(char *str, int c); Заполняет строку str символом с. |
strnset |
char *strnset(char *str, int c, int kol); Заменяет первые kol символов строки str символом с. |
strpbrk |
int strpbrk(char *str1, char *str2); Ищет в строке str1 первое появление любого из множества символов, входящих в строку str2. |
strrchr |
char *strrchr(char *str, int c); Ищет в строке str последнее вхождение символа с. |
strstr |
char *strstr(char *str1, char *str2); Ищет в строке str1 подстроки str2. Возвращает указатель на тот элемент в строке str1, с которого начинается подстрока str2. |
2. Файлы и потоки.
2.1. Понятие файла и потока.
Файлы и их представления. Файлы являются существенной частью современных компьютерных систем. Они используются для хранения произвольной (текстовой, графической, аудио, видео и др.) информации. Файл - это именованный раздел для сохранения информации, обычно раздел на диске. Например, относительно stdio.h можно думать как об имени файла, содержащем некоторую полезную информацию.
Язык С рассматривает файл как последовательность байтов, каждый из которых может быть прочитан индивидуально. Стандартами установлено два вида представления файлов: текстовое и двоичное. В текстовом представлении то, что видит программа может отличаться от того, что находится в файле. В случае использования двоичного представления, программа будет видеть точно ту последовательность байтов, которая записана в файле.
Библиотека языка С поддерживает три уровня ввода-вывода: потоковый ввод-вывод, ввод-вывод нижнего уровня и ввод-вывод для консоли и портов.
Стандартные файлы. Программы С автоматически открывают три файла. Они имеют названия стандартный ввод (stdin), стандартный вывод (stdout) и стандартный вывод ошибок (stderr). Стандартный ввод - это по умолчанию обычное устройство ввода в системе, как правило, клавиатура. Оба стандартных вывода по умолчанию также представляют собой обычное устройство вывода, как правило, монитор.
Стандартный ввод естественным образом обеспечивает ввод для программ. Этот файл, который читается с помощью функций getchar(), gets(), scanf(). Стандартный вывод - это место, куда направляется обычный вывод программы. При обработке вывода используются функции putchar(), puts(), printf(). Назначение стандартного вывода ошибок заключается в обеспечении логически понятного направления для посылки сообщений об ошибках.
На уровне потокового ввода-вывода обмен данными производится побайтно. В случае файлов на диске используется поблочный обмен, при котором за одно обращение к устройству читается или записывается фиксированная порция данных. При вводе данные сначала помещаются в буфер операционной системы, а уж затем передаются программе пользователя. При выводе данные накапливаются в буфере, а уж затем за одно обращение записываются на диск. Буферы операционной системы реализуются в виде участков оперативной памяти. Поэтому пересылки между буферами ввода-вывода и выполняемой программой происходят достаточно быстро в отличие от реальных обменов с физическими устройствами.
Функции С++, поддерживающие обмен данными с файлами на уровне потока, позволяют обрабатывать данные различных размеров и форматов, обеспечивая при этом буферизованный ввод-вывод. Таким образом, поток - это файл вместе с предоставляемыми средствами буферизации. При работе с потоками можно производить следующие действия:
- открывать и закрывать потоки (т.е. связывать указатели на потоки с конкретными файлами);
- вводить и выводить: символ, строку, форматированные данные, порцию данных произвольной длины;
- анализировать ошибки потокового ввода-вывода и условие достижения конца файла;
- управлять буферизацией потока и размером буфера;
- получать и устанавливать указатель текущей позиции в потоке.
