Анимация
JavaScript
|
Главная Библионтека Содержит точку, но без расширения: присоединить символы tmp tmpname = filename: tmpname +- suffix; else if (extname == suffix) { Расширение tmp заменяется на xxx 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.findC.); Функция 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() передается начальный индекс. Необязательный второй аргумент определяет количество символов (а не конечный индекс!) Если второй аргумент отсутствует, в возвращаемую подстроку включаются все оставшиеся символы строки. Всюду, где в аргументах передаются индекс и длина, выполняются представленные ниже два правила. О Аргумент, определяющий индекс, должен быть действительным для данной строки. Его значение должно быть меньше количества символов в строке (как обычно, индекс первого символа равен 0). Кроме того, для определения конца может использоваться индекс позиции за последним символом. Как правило, при обращении но индексу, превышающему фактическое количество символов, генерируется исключение out of range. О Аргумент, определяющий количество символов, может иметь произвольное значение. Если он больше количества оставшихся символов в строке, то используются все оставшиеся символы, В частности, конструкция string::npos всегда может обозначать «все оставшиеся символы». Следовательно, при отсутствии точки в следующем выражении произойдет исключение: filename.sub5tr(filename,findC".)) С другой стороны, показанное ниже выражение будет выполнено без исключений: filename.substrCO. filename.findC ,)) Если точка не найдена, возвращается все имя файла. Но даже при наличии точки расширение, возвращаемое при вызове substr(), может оказаться пустым, если за точкой нет ни одного символа. Данная ситуация проверяется условием: if (extname.emptyC)) Если условие истинно, то имя временного файла состоит из обычного имени файла с заранее определенным расширением; tmpname = filename; tmpname += suffix; Расширение присоединяется оператором +=. Также нельзя исключать, что имя файла уже содержит расширение для временных файлов. Чтобы выявить эту ситуацию, мы сравниваем две строки оператором === следующим образом; if (extname == suffix) Если это условие истинно, то обычное расширение временных файлов заменяется расширением ххх: tmpname = filename; tmpname,replace (idx+1. extname.size(). "xxx"); Выражение extname.size() возвращает количество символов в строке extname. Вместо size() также можно воспользоваться эквивалентной функцией length(). Таким образом, обе функции size() и iength() возвращают количество символов. 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 [ 146 ] 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 |