|
Программирование >> Разработка устойчивых систем
В стандарте IEEE POSIX (Portable Operating System Interface) обобщены многие низкоуровневые системные функции, используемые в системах семейства Unix. сегг missing filename\n : exit(EXIT FAILURE): Все компоненты присутствуют; построение имени в full Path string full Path(root); if(subdir.lengthO > 0) fullPath.append(subdir).append( / ); assert(fullPath[fullPath.length()-l] == V); if (!exists(fullPath)) #ifdef GNUC mkdir(fullPath.c str(). 0); Создание подкаталога #else mkdir(full Path.c str()); Создание подкаталога #endif ful1 Path.append(1i ne.substr(startOfFi 1 e. endOfFile - startOfFile)); outf.open(ful1 Path.c str()); ifdoutf) { cerr error opening full Path for output\n ; exit(EXIT FAILURE); inCode = true; cout Processing fullPath endl; if(printDelims) outf line endl; else if(inCode) { assert(outf); outf line endl; Вывод строки программы exit(EXIT SUCCESS); } /;- Обратите внимание на директивы условной компиляции. Функция mkdir(), создающая каталог в файловой системе, по стандарту POSIX определяется в заголовочном файле <sys/stat.h>. К сожалению, многие компиляторы продолжают использовать другой заголовочный файл (<direct.h>). Сигнатуры mkdir() также различаются: в POSIX функция вызывается с двумя аргументами, а в старых версиях - только с одним. Из-за этого в программе позднее присутствуют дополнительные команды условной компиляции для выбора правильного вызова mkdir(). Обычно мы не задействуем условную компиляцию в своих примерах, но эта конкретная программа слишком полезна, и к ней стоит приложить небольшие дополнительные усилия. Функция existsO в программе ExtractCode.срр проверяет существование каталога. Для этого она пытается открыть временный файл в этом каталоге. Если попытка открытия завершается неудачей, считается, что каталог не существует. Чтобы удалить файл, мы передаем его имя в формате char* функции stcl::remove(). Основная программа проверяет аргументы командной строки, а затем читает входной файл по строкам, проверяя наличие специальных ограничителей. Логи- Упражнения 1. Напишите и протестируйте функцию, которая переставляет символы строки в обратном порядке. 2. Палиндромом называется слово или фраза, которые одинаково читаются в обоих направлениях (например, madam или wow ). Напишите программу, которая читает строковый аргумент из командной строки и при помощи функции из предьщущего упражнения проверяет, является ли эта строка палиндромом. ческий флаг inCode указывает, находится ли программа в процессе чтения программного блока (то есть вывода читаемых строк). Флаг printDelims равен true, если за открывающим маркером не следует восклицательный знак; в противном случае первая и последняя строки не выводятся. Важно начать проверку с конечного маркера, поскольку начальный маркер полностью входит в него, и поиск по начальному маркеру будет успешным для обоих случаев. Обнаружив закрывающий маркер, мы убеждаемся в том, что в настоящее время обрабатывается блок программного кода; если это не так, то при размещении маркеров в текстовом файле были допущены ошибки. Если флаг inCode равен true, все идет нормально, мы выводим последнюю строку (если ее нужно выводить) и закрываем файл. При обнаружении начального маркера программа выделяет из строки имена каталога и файла, после чего открывает файл. В приведенном примере используются следующие строковые функции: length(), append(), getline(), find() (две версии), fincl first not of(), substr(), find first of(), c str() и, конечно, operator (). Итоги Объекты С++ string обладают огромными преимуществами перед своими прототипами из языка С. Прежде всего это связано с тем, что класс string позволяет работать со строками без применения указателей. При этом исчезает целый класс программных ошибок, обусловленных применением неинициализированных или неправильно инициализированных указателей. Строки С++ динамически расширяют свой внутренний блок данных в соответствии с увеличением объема строковых данных, причем это не требует участия пользователя. Когда данные строки выходят за пределы изначально выделенной памяти, строковый объект вызывает функции для выделения и освобождения памяти в кзе (динамическом пуле). Проверенная схема управления памятью предотвращает утечки и обычно работает гораздо эффективнее самодельных решений. Функции класса string предоставляют достаточно полный инструментарий для создания строк, их модификации и поиска. Сравнения в стандартном классе string всегда выполняются с зетом регистра символов, но это ограничение можно обойти разными способами - копированием строковых данных в строки С, завершенные нуль-символами, временным преобразованием данных строковых объектов к общему регистру или созданием класса с переопределением стандартных характеристик символов, используемых при специализации шаблона basic string. 3. Измените программу из упражнения 2, чтобы она возвращала true даже в том слзае, если симметричные символы различаются регистром. Например, слово Civic должно считаться палиндромом, хотя его первая буква принадлежит к верхнему регистру. 4. Измените программу из упражнения 3, чтобы она игнорировала пробелы и знаки препинания. Например, для строки Able was I, ere I saw Elba должно возвращаться значение true. 5. Рассмотрим следующие объявления строк: string oneCI walked down the canyon with the moving mountain bikers. ): string two( The bikers passed by me too close for comfort. ): string three( I went hiking instead. ) Используя только эти объявления и символы char (никаких строковых литералов или волшебных чисел ), постройте последовательность предложений: I moved down the canyon with the mountain bikers. The mountain bikers passed by me too close for comfort. So I went hiking instead. 6. Напищите программу replace, которая получает из командной строки три аргумента: входной текстовый файл, заменяемую строку (назовем ее from) и строку замены (назовем ее to). Программа должна записать в стандартный выходной поток новый файл, в котором все вхождения from заменяются на to. 7. Повторите предыдущее упражнение так, чтобы заменялись все экземпляры from независимо от регистра символов. 8. Измените программу из упражнения 3, чтобы она читала имя файла из командной строки и выводила все слова-палиндромы из этого файла (без учета регистра). Не выводите дубликаты даже при различиях в регистре символов. Не пытайтесь искать палиндромы, размер которых превышает одно слово (в отличие от упражнения 4), 9. Измените программу HTMLStripper.cpp, чтобы при обнаружении тегов она выводила имя тега и содержимое файла между начальным и конечным тегами. Предполагается, что вложенные теги отсутствуют, а конечные теги всегда задаются явно (в формате </тег>). 10. Напишите программу, которая получает из командной строки три аргумента (имя файла и две строки) и выводит на консоль все логические строки файла, содержащие обе искомые строки, одну из них или ни одной в зависимости от того, какой режим выберет пользователь в начале программы. Во всех режимах, кроме последнего, выделите входные строки (или строку), отметив их начало и конец символами *. 11. Напишите программу, которая получает из командной строки два аргумента (имя файла и строку) и подсчитывает количество вхождений строки в файл даже в составе других слов. Перекрывающиеся вхождения игнорируются. Например, входная строка Ьа обнаруживается в слове basketball дважды, но входная строка апа обнаруживается в слове Ьапапа только один раз. Выведите на консоль количество вхождений и среднюю длину слов, в которых присутствуют совпадения (если строка входит в слово несколько раз, учитывается только одно вхождение).
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |