|
Программирование >> Операторы преобразования типа
1ример построения имени временного файла в первом примере строится имя временного файла по аргументам командной строки. Например, рассмотрим следующую команду: stringl prog.dat mydir hello, oops.tmp end.dat Если запустить программу с этими аргументами, то результат будет выглядеть так: prog.dat => prog.tmp mydir => mydir.tmp hello. => hello.tmp oops.tmp => oops.XXX end.dat => end.tmp В большинстве случаев временный файл снабжается расширением .tmp, а при передаче имени временного файла в аргументе вместо него используется расширение .XXX. strlng/stringl.cpp #include <iostream> Iinclude <string> using namespace std: int main (int argc. char* argv[]) { string filename, basename. extname. tmpname; const string suffixCtmp ): /* Для каждого аргумента командной строки * (который является обычной С-строкой) */ for (int i=l: 1<агдс; ++i) { Аргумент интерпретируется как имя файла filename = argv[1]: Поиск точки в имени файла string::5i2e type idx = filename.find(.); If (1dx == string::npos) { Имя файла не содержит точек tmpname = filename + . + suffix: else { /* Разделение имени файла на базовое имя и расширение * - базовое имя содержит все символы перед точкой * - расширение содержит все символы после точки */ basename = filename,5ub5tr(0. Idx): extname = filename.substrddx+l): if (extname.emptyO) { Содержит точку, но без расширения: присоединить символы tmp tmpname = filename: tmpname +- suffix: else if (extname == suffix) { Расширение tmp заменяется на ххх tmpname = filename: tmpname.replace (idx+1. extname.size(). xxx ); else { Замена любого расширения на tmp tmpname - filename; tmpname.replace (idx+1, string:;npos. suffix): Вывод имен исходного и временного файлов cout filename => tmpname endl: Сначала показанная ниже директива включает заголовочный файл стандартных строковых классов С++: finclude <string> Как обычно, эти классы объявляются в пространстве имен std. Следующее объявление создает четыре строковые переменные: string filename, basename, extname. tmpname: Аргументы не передаются, поэтому инициализация выполняется конструктором но умолчанию класса string. Конструктор но умолчанию инициализирует неременные пустыми строками. Следующее объявление создает константную строку suffix со стандартным расширением для временных файлов: const string suffix( tmp ); Переменная инициализируется обычной С-строкой и получает эначение tmp. С-строки могут комбинироваться с объектами класса string практически всегда, когда могут использоваться два объекта string. В частности, все вхождения переменной suffix в программе можно заменить С-строками tmp . При каждой итерации цикла for показанная ниже команда присваивает новое значение строковой неременной filename: filename = argv[l]; В данном случае новое значение определяется обычной С-строкой, однако оно также может определяться другим объектом класса string или отдельным символом (char). В частности, тип size type для строк зависит от модели памяти, используемой строковым классом. Подробности приведены на с. 508. Следующая команда ищет в строке filename первое вхождение символа . (точка): itnng::slze type idx = filename.f1ndC.); Функция find() входит в группу функций, предназначенных для поиска в стро-сах. Другие функции этой группы позволяют выполнить поиск в обратном на-1равлении, поиск подстрок, ограничить поиск определенной частью строки или 1айти вхождение одного из нескольких возможных символов. Все поисковые [)уикции возвращают не итератор, а целочисленный индекс позиции первого сов-тадения. Стандартный интерфейс строк не соответствует интерфейсу шаблонов >TL, хотя итераторы могут работать и со строками (см. с. 480). Возвращаемое шачение всех функций относится к типу string::slze type - целочисленному беззна-совому типу, определяемому в строковом классе. Как обычно, индекс первого ;имвола равен О, а индекс последнего символа - numberofCharacters-i. Помните, гго индекс numberOf Characters не является допустимым индексом. В отличие от 3-строк объекты класса string не завершаются специальным символом \0 . Признак неудачи при поиске возвращается в виде специального значения ipos, которое также определяется строковым классом. Таким образом, следую-цая строка проверяет, была ли найдена точка в имени файла: f (idx string::npos) Тип и значение npos часто становятся причиной ошибок при работе со стро-сами. Будьте внимательны и всегда используйте следующую конструкцию при троверке возвращаемого значения функции поиска (а не Int или unsigned int): itring::size type В противном случае сравнение с string::npos может не сработать. За подроб-10СТЯМИ обращайтесь на с. 478. Если поиск точки оказывается неудачным, значит, имя файла не содержит засширения. В этом случае имя временного файла строится из исходного имени })айла, точки и заранее определенного расширения для временных файлов: :mpname filename + . + suffix; Конкатенация двух строк производится при помощи обычного оператора +. 3 конкатенации также могут участвовать С-строки и одиночные символы. При обнаружении точки используется секция else. В этом случае имя файла по индексу найденного символа разбивается на две части: базовое имя и расширение. Разбиение производится функцией substr(): basename filename.substr(0. idx): extname - filename.substr(1dx+l); В первом аргументе функции substr() передается начальный индекс. Необязательный второй аргумент определяет количество символов (а не конечный индекс!) Если второй аргумент отсутствует, в возвращаемую подстроку включаются все оставшиеся символы строки.
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |