Программирование >>  Операторы преобразования типа 

1 ... 143 144 145 [ 146 ] 147 148 149 ... 239


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() передается начальный индекс. Необязательный второй аргумент определяет количество символов (а не конечный индекс!) Если второй аргумент отсутствует, в возвращаемую подстроку включаются все оставшиеся символы строки.



1 ... 143 144 145 [ 146 ] 147 148 149 ... 239

© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика