Программирование >>  Разработка устойчивых систем 

1 ... 32 33 34 [ 35 ] 36 37 38 ... 196


12. Напишите программу, которая ползает из командной строки имя файла и выводит информацию об использовании всех символов, включая знаки препинания и пробелы (символы с кодами от 0x21 [33] до 0х7Е[126], атакже пробел). Иначе говоря, подсчитайте количество вхождений каждого символа в файл и выведите результаты отсортированными либо последовательно (пробел, затем !, , # и т. д.), либо по возрастанию или убыванию количества вхождений в зависимости от пользовательского ввода в начале программы. Для пробела вместо символа выводится строка Space. Примерный результат выглядит так:

Format sequentially, ascending or descending

(S/A/D): D t: 526 r: 490 etc.

13. Используя функции find() и rfind(), напишите программу, которая получает из командной строки два аргумента (имя файла и строку) и выводит первое и последнее слова (и их индексы), не совпадающие с заданной строкой, а также индексы первого и последнего вхождений строки. Если ни одна из проверок не дает результатов, выведите Not founds.

14. Используя функции семейства find first of (но не ограничиваясь ими), напишите программу, которая удаляет из файла все неалфавитные символы, кроме точек и пробелов, а затем преобразует каждую первую букву, следующую после точки, к верхнему регистру.

15. Используя функции семейства find first of, напишите программу, которая получает из командной строки имя файла и преобразует все числа в этом файле к формату денежных величин. Игнорируйте десятичные точки после первой до обнаружения нечислового символа, а затем округлите до двух чисел в дробной части. Например, строка 12.399abc29.00.6a приводится к виду $12.40аЬс$29.01а.

16. Напишите программу, которая получает из командной строки два аргумента (имя файла и число) и переставляет буквы в словах. Для этого программа выбирает две буквы, меняет их местами и повторяет эту процедуру столько раз, сколько задано вторым аргументом. Например, если во втором аргументе передается О, слова не изменяются; если второй аргумент равен 1, меняется местами одна пара букв; если второй аргумент равен 2, меняются местами две пары и т. д.

17. Напишите программу, которая получает из командной строки имя файла и выводит количество предложений в этом файле (определяемое по количеству точек), среднее количество символов в одном предложении и общее количество символов в файле.

18. Докажите, что функция at() действительно запускает исключение при недопустимом значении индекса, а оператор индексирования [ ] этого не делает.



Потоки ввода-вывода

в плане ввода-вывода язык С++ отнюдь не ограничивается простой инкапсуляцией в классах стандартного ввода-вывода.

Разве не замечательно было бы, если бы все операции с обычными участниками ввода-вывода - консолью, файлами и даже блоками памяти - выполнялись одинаково, чтобы программисту было достаточно запомнить только один интерфейс? Эта концепция заложена в основу потоков ввода-вывода. Они гораздо удобнее, безопаснее, а в отдельных случаях и эффективнее соответствующих функций стандартной библиотеки stdio языка С.

Начинающие программисты С++ обычно начинают свое знакомство со стандартной библиотекой именно с классов потоков ввода-вывода. В этой главе будет показано, в чем потоки ввода-вывода превосходят средства языка С, а также исследовано поведение файловых и строковых потоков в дополнение к стандартным консольным потокам.

Зачем нужны потоки?

Возникает вопрос - чем плоха старая библиотека С? Нельзя ли просто завернуть библиотеку С в классы и ограничиться этим? Иногда такого решения оказывается вполне достаточно. Допустим, вы хотите сделать так, чтобы файл, представленный указателем stdio FILE, всегда безопасно открывался и корректно закрывался, даже если пользователь забудет вызвать функцию close(). Попытка такого рода сделана в следующей программе: : C04:FileClass.h

Объектный интерфейс для файлов stdio #ifndef FILECLASSJ #define FILECLASSJ #include <cstdio> #include <stdexcept>

class FileClass (



Std::FILE* f; public:

struct FileClassError : std::runtime error { FileClassError(const char* msg) : std::runtime error(msg) {}

FileClass(const char* fname. const char* mode - r ):

-FileClassO:

std::FILE* fpO;

#endif FILECLASS H 111

При выполнении файловых операций ввода-вывода в С вы работаете с низкоуровневым указателем на структуру FILE. Представленный класс инкапсулирует этот указатель, гарантируя его правильную инициализацию и освобождение в конструкторе и деструкторе. Второй аргумент конструктора определяет режим файла; по умолчанию используется режим г (чтение).

Функция fp() возвращает указатель, используемый функциями файлового ввода-вывода. Определения функций класса FileClass выглядят так:

: С04:FileClass.срр {0} Реализация FileClass linclude FileClass.h linclude <cstdlib> linclude <cstdio> using namespace std:

FileClass::FileClass(const char* fname. const char* mode) { if((f = fopen(fname. mode)) = 0) throw FileClassErrorCError opening file ):

FileClass::-FileClass() { fclose(f); } FILE* FileClass::fp() { return f; } III:-

Конструктор вызывает функцию fopen(), как при обычном открытии файла, но он также проверяет, что результат отличен от нуля (признак ошибки открытия файла). Если попытка открытия файла завершилась неудачей, класс запускает исключение.

Деструктор закрывает файл, а функция fp() возвращает закрытую переменную f. Ниже приводится простой пример использования класса FileClass:

: C04:FileClassTest.cpp {L} FileClass linclude <cstdlib> linclude <iostream> linclude FileClass.h using namespace std;

int mainO { try {

Fi1eClass f( Fi1eClassTest.cpp ); const int BSIZE = 100; char buf[BSIZE]:

while(fgets(buf. BSIZE. f.fpO)) fputs(buf. stdout); } catch(FileClass::FileClassError& e) {



1 ... 32 33 34 [ 35 ] 36 37 38 ... 196

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