Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Режимы открытия файлов




Режимы открытия файлов устанавливают характер использования файлов. Для установки режима в классе ios_base предусмотрены константы - флаги, которые определяют режим открытия файлов (см. Таблица 10).

Таблица 10 Флаги открытия файлов

Константа Описание
ios_base::in открыть файл для чтения
ios_base::out открыть файл для записи
ios_base::ate при открытии переместить указатель в конец файла
ios_base::app открыть файл для записи в конец файла
ios_base::trunc удалить содержимое файла, если он существует
ios_base::binary открытие файла в двоичном режиме

Режимы открытия файлов можно устанавливать непосредственно при создании объекта или при вызове функции open().

ofstream fout("cppstudio.txt", ios_base::app); // открываем файл для добавления информации к концу файла fout.open("cppstudio.txt", ios_base::app); // открываем файл для добавления информации к концу файла

Режимы открытия файлов можно комбинировать с помощью поразрядной логической операции «или» |, например: ios_base::out | ios_base::trunc - открытие файла для записи, предварительно очистив его.

Лабораторная работа № 8. Работа с файлами.

Продолжительность – 4 часа.

Максимальный рейтинг – 8 баллов.

Цель работы

Научиться работать с файловыми переменными посредствам подпрограмм библиотек fstream.h и stdio.h. Закрепить навыки работы со строками. Научиться открывать файлы для записи и чтения, создавать и уничтожать файлы, определять конец файла.

Задание на лабораторную работу

1. Написать, отладить и протестировать программу, выполняющую операции с текстовыми файлами в соответствии со своим вариантом (Таблица 11). Продемонстрировать использование при этом файловых функций из библиотек «fstream.h» и «stdio.h».

2. Подобрать текст размером не менее 30 строк, в тексте обязательно должны содержаться те символы и подстроки, работа с которыми предусмотрена в индивидуальном задании.

3. Результат работы программы выводить на экран и обязательно сохранять в файл результатов.

4. Производимые над строками текстового файла операции оформить в виде подпрограмм. В теле подпрограмм допускается использование функций стандартных библиотек работы со строками «string.h» и т.п.

5. По выполненной лабораторной работе подготовить отчет с результатами работы программы. В отчет вставить листинг программного кода, исходный файл и файл результатов. Отчет без комментариев не принимается.

 

Таблица 11 Варианты индивидуальных заданий

Задание
1. Определить количество вхождений символов «Я» и «я» в тексте, заменить эти символы на «Ты» и «ты» соответственно.
2. Препроцессинг китайского: Записать строки текста по столбцам сверху вниз.
3. Подсчитать количество вхождений всех символов в текст.
4. Отсортировать символы в строках, а после отсортировать строки в тексте «по убыванию».
5. Отсортировать символы в строках «по возрастанию». Удалить из строк все символы отличные от букв и цифр.
6. В конец каждой строки дописать количество символов этой строки.
7. Заменить все символы текста соответствующими символами кода Морзе.
8. Создать числовой массив, в который занести количество букв в каждой строке.
9. Заменить все буквы в строках текста их кодами, при этом знаки препинания и цифры не заменять.
10. Расположить строки текста «по возрастанию». Удалить из текста цифры.
11. Осуществить перевод всех символов текста в верхний регистр, а цифры и знаки препинания удалить.
12. Препроцессинг иврита: Записать символы строк текста в обратном порядке, заменяя все вхождения подстрок «да» на подстроки «таки да».
13. Оставить в тексте только цифры, заменив все буквы символами «*», а знаки препинания – символами «@».
14. Из заданного текстового файла сгенерировать три: в одном – только буквы, в другом – цифры, в третьем – все остальные символы.
15. Подсчитать количество пробелов в строках и всего в тексте. Удалить пробелы.
16. Удалить все пробелы из текста. Подсчитать количество удалений.
17. Препроцессинг женской логики: Заменить в тексте все вхождения слов «да» и «нет» на «может быть». Все имена собственные (с заглавной буквы) на слово «Зая».
18. В конец каждой строки дописать, содержит ли строка символы, отличные от латинских букв.
19. Буквы расположенные в четных позициях перевести в прописные (заглавные), а те, которые на нечетных – в строчные (маленькие).
20. Все цифры в тексте заменить их строчным написанием: 1 - «один», 2 – «два» и т.д.
21. Подсчитать количество слов в каждой строке и всего в тексте.
22. В конец каждой строки дописать позицию первого вхождения символа «А» в эту строку.
23. Препроцессинг телеграфа: перевести все символы в верхний регистр и все знаки препинания в тексте заменить на соответствующие обозначения: символ «.» - на «ТЧК», символ «,» - на «ЗПТ» и т.д.
24. Каждое слово в тексте записать в обратном порядке. Последовательность слов не менять.

 

Структуры языка С

- Здравствуйте, Катю можно?
- Она в архиве.
- Разархивируйте ее, пожалуйста,
она мне срочно нужна!

Переименование типов (typedef)

Для того чтобы сделать программу более ясной, можно задать типу новое имя с помощью ключевого слова typedef. Введенное таким образом имя можно использовать таким же образом, как и имена стандартных типов.

Пример:

typedef unsigned int UINT; typedef char Msg[100]; UINT i, j; // две переменных типа unsigned int Msg str[10]; // массив из 10 строк по 100 символов

Перечисления (enum)

При написании программ часто возникает потребность определить несколько именованных констант, для которых требуется, чтобы все они имели различные значения. Для этого удобно воспользоваться перечисляемым типом данных - enum, все возможные значения которого задаются списком целочисленных констант.

enum имя_типа { список_констант };

Имя типа задается в том случае, если в программе требуется определять переменные этого типа. Компилятор обеспечивает, чтобы эти переменные принимали значения только из списка констант. Константы должны быть целочисленными и могут инициализироваться обычным образом. При отсутствии инициализатора первая константа обнуляется, а каждой следующей присваивается на единицу большее значение, чем предыдущей:

enum Err {ERR__READ, ERR__WRITE, ERR_CONVERT}; // задан тип Err error; // определена переменная типа Err switch (error) { case ERR_READ: /* операторы */ break; case ERR_WRITE: /* операторы */ break; case ERR_CONVERT: /* операторы */ break; } // Константам ERR_READ, ERR_WRITE, ERR_CONVERT присваиваются // значения 0, 1 и 2 соответственно

Пример:

enum {two = 2, three, four, ten = 10, eleven, fifty = ten + 40}; // Константам three и four присваиваются значения 3 и 4, константе eleven — 11

Имена перечисляемых констант должны быть уникальными, а значения могут совпадать. Компилятор при инициализации констант выполняет проверку типов.

Структуры (struct)

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

struct имя_типа { тип_1 элемент_1: тип_2 элемент_2;... тип_n элемент_n; } список_описателей;

Если отсутствует имя типа, должен быть указан список описателей переменных, указателей или массивов. В этом случае описание структуры служит определением элементов этого списка:

struct // безымянная структура { char f1o[30]; // поля структуры int date, code; double salary; } staff[100], *ps; // определен массив структур и указатель на структуру

Если список отсутствует, описание структуры определяет новый тип, имя которого можно использовать в дальнейшем наряду со стандартными типами, например:

struct Worker// описание нового типа Worker { char fio[30]; int date, code; double salary; }; // описание заканчивается точкой с запятой Worker staff[100], *ps; // определение массива типа Worker и указателя на Worker

Для инициализации структуры значения ее элементов перечисляют в фигурных скобках в порядке их описания:

struct { char fio[30]; int date, code; double salary; } worker = {"Путинович В. В.", 31, 215, 3400.55 };

При инициализации массивов структур следует заключать в фигурные скобки каждый элемент массива

struct complex { float real, im; } compl [2][3] = { { {0, 0}, {0, 1}, {0, 2} }, // строка 1, то есть массив compl[0] { {1, 0}, {1, 1}, {1, 2} } }; // строка 2, то есть массив compl[1]

Для переменных одного и того же структурного типа определена операция присваивания, при этом происходит поэлементное копирование. Структуру можно передавать в функцию и возвращать в качестве значения функции.

Доступ к полям структуры выполняется с помощью операций выбора «.» (точка) при обращении к полю через имя структуры и «->» при обращении через указатель, например:

Worker worker, staff[100], *ps; worker.fio = "Медведевский Д. А."; staff[8].code = 216; ps->salary = 0.12;

Если элементом структуры является другая структура, то доступ к ее элементам выполняется через две операции выбора:

struct А {int а; double х;}; struct В {А а; double х;} х[2]; х[0].а.а = 1; х[1].х = 0.1;

Как видно из примера, поля разных структур могут иметь одинаковые имена, поскольку у них разная область видимости.

Битовые поля

Битовые поля – это особый вид полей структуры. Они используются для плотной упаковки данных, например, логических флагов со значениями «false/true». Минимальная адресуемая ячейка памяти – 1 байт, а для хранения флага достаточно одного бита. При описании битового поля после имени через двоеточие указывается длина поля в битах (целая положительная константа):

struct Options { bool centerX:1; bool centerY:1; unsigned int shadow:2; unsigned int palette:4; };

Битовые поля могут быть любого целого типа. Имя поля может отсутствовать, такие поля служат для выравнивания на аппаратную границу. Доступ к полю осуществляется обычным способом – по имени. Адрес поля получить нельзя, однако, в остальном битовые поля можно использовать точно так же, как обычные поля структуры. Следует учитывать, что операции с отдельными битами реализуются гораздо менее эффективно, чем с байтами и словами, так как компилятор должен генерировать специальные коды, и экономия памяти под переменные оборачивается увеличением объема кода программы.

Объединения (union)

Объединение (union) представляет собой частный случай структуры, все поля которой располагаются по одному и тому же адресу. Формат описания такой же, как у структуры, только вместо ключевого слова struct используется слово union. Длина объединения равна наибольшей из длин его полей. В каждый момент времени в переменной типа объединение хранится только одно значение, и ответственность за его правильное использование лежит на программисте.

Объединения применяют для экономии памяти в тех случаях, когда известно, что больше одного поля одновременно не требуется:

int main() { enum paytype { CARD, CHECK }; paytype ptype; union payment { char card[25]; long check; } info; // присваивание значений info и ptype switch (ptype) { case CARD: cout << "Оплата no карте: " << info.card; break; case CHECK: cout << "Оплата чеком: " << info.check; break; }return 0; }

Объединение часто используют в качестве поля структуры, при этом в структуру удобно включить дополнительное поле, определяющее, какой именно элемент объединения используется в каждый момент. Имя объединения можно не указывать, что позволяет обращаться к его полям непосредственно:

Объединения применяются также для разной интерпретации одного и того же битового представления (но, как правило, в этом случае лучше использовать явные операции преобразования типов). В качестве примера рассмотрим работу со структурой, содержащей битовые поля:

struct Options { bool centerX:1; bool centerY:1; unsigned int shadow:2; unsigned int palette:4; }union { unsigned char ch; Options bit; } option = {0xC4};cout << option.bit.palette; option.ch &= 0xF0; // наложение маски

По сравнению со структурами и классами на объединения налагаются некоторые ограничения:

• объединение может инициализироваться только значением его первого элемента;

• объединение не может содержать битовые поля;

• объединение не может содержать виртуальные методы, конструкторы, деструкторы и операцию присваивания;

• объединение не может входить в иерархию классов.

Поделиться:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...