МегаПредмет

ПОЗНАВАТЕЛЬНОЕ

Сила воли ведет к действию, а позитивные действия формируют позитивное отношение


Как определить диапазон голоса - ваш вокал


Игровые автоматы с быстрым выводом


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


Целительная привычка


Как самому избавиться от обидчивости


Противоречивые взгляды на качества, присущие мужчинам


Тренинг уверенности в себе


Вкуснейший "Салат из свеклы с чесноком"


Натюрморт и его изобразительные возможности


Применение, как принимать мумие? Мумие для волос, лица, при переломах, при кровотечении и т.д.


Как научиться брать на себя ответственность


Зачем нужны границы в отношениях с детьми?


Световозвращающие элементы на детской одежде


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


Как слышать голос Бога


Классификация ожирения по ИМТ (ВОЗ)


Глава 3. Завет мужчины с женщиной


Оси и плоскости тела человека


Оси и плоскости тела человека - Тело человека состоит из определенных топографических частей и участков, в которых расположены органы, мышцы, сосуды, нервы и т.д.


Отёска стен и прирубка косяков Отёска стен и прирубка косяков - Когда на доме не достаёт окон и дверей, красивое высокое крыльцо ещё только в воображении, приходится подниматься с улицы в дом по трапу.


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

Дополнительные полезные функции для работы с файлами





Функция «перемотки» – сброса признаков ошибок и перемещения текущей позиции на начало файла – rewind():

void rewind(FILE *stream);

Вызов функции rewind(fp) эквивалентна следующему фрагменту программы:

fseek(fp, 0L, SEEK_SET);

clearerr(fp);

Функции записи текущей позиции в потоке stream и восстановления в нем ранее сохраненной позиции fgetpos() и fsetpos():

int fgetpos(FILE *stream, fpos_t *ptr);

int fsetpos(FILE *stream, const fpos_t *ptr);

Текущая позиция в потоке сохраняется в переменной специально предназначенного типа fpos_t, причем в обе функции передается указатель на переменную соответствующего типа (адрес переменной). Обе функции в случае ошибки возвращают значение, отличное от нуля.

Для переименования или удаления файлов средствами операционной системы без их открытия предусмотрены стандартные функции rename и remove соответственно:

int rename(const char *oldname, const char *newname);

int remove(const char *filename);

Параметры функций очевидны: oldname и newname – старое и новое имя переименовываемого файла, filename – имя удаляемого файла. Обе функции в случае ошибки возвращают значение, отличное от нуля.

На практике также могут представлять интерес функции для работы с временными файлами tmpfile() и tmpname(), подробное описание которых также можно найти в специальной литературе [Керниган, Ричи 2013, Б.1.1]

Постановка задачи

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

Задания могут быть выполнены на трех уровнях сложности.

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

2) Средний. Имена входных файлов должны передаваться программе при ее запуске (через параметры функции main()). Исходный файл к первой задаче может содержать как латинские, так и русские буквы, на одной строке может находиться несколько фраз, возможно продолжение фразы на следующей строке. Фразы отделяются друг от друга точками, а слова – пробелами и знаками препинания. Последняя фраза в файле может быть без точки в конце. Вывод содержимого файла записей осуществлять в табличном виде с графлением визуально подходящими символами.

3) Высокий. Имена входных файлов должны передаваться программе при ее запуске (через параметры функции main()). Если параметры пользователем при запуске программы не заданы, имена файлов вводятся с клавиатуры. Исходный файл к первой задаче может содержать как латинские, так и русские буквы, фразы могут быть любой длины, соответственно, одна фраза может располагаться на нескольких строках. Фразы отделяются друг от друга точками, а слова – пробелами и знаками препинания. Последняя фраза в файле может быть без точки в конце. Вывод содержимого файла записей осуществлять постранично в табличном виде с графлением визуально подходящими символами, предусмотреть возможность «листания» страниц как в прямом, так и в обратном направлении.



Варианты заданий

Вариант № 1 1. Дан файл, содержащий некоторый текст. Удалить из этого файла все фразы, содержащие слово «мама».[ОА2] 2. В текстовом файле хранится целочисленная матрица. Заменить в ней все числа, кратные 7, наибольшим значением матрицы. Полученный файл вывести на экран.[ОА3] 3. Компоненты бинарного файла – вещественные числа. Изменить знак у каждого третьего числа на противоположный[U4] [ОА5] . 4. Дан файл, содержащий сведения об ассортименте игрушек в магазине. Структура записи: название игрушки, цена, количество, возрастные границы, например от 2 до 5. Вывести названия игрушек, которые подходят детям определенного возраста и стоят не больше определенной суммы. Получить сведения о самом дорогом конструкторе.[ОА6] [U7]
Вариант № 2 1. Дан файл, содержащий некоторый текст. Удалить из файла все фразы, заканчивающиеся и начинающиеся на одну и ту же букву[U8] [ОА9] .[U10] 2. В текстовом файле содержится целочисленная матрица. Определить количество простых чисел в каждой строке матрицы и результаты записать в новый текстовый файл с указанием номеров строк исходного файла. 3. Компоненты бинарного файла – вещественные числа. Поменять местами первый компонент файла с минимальным, а последний – с максимальным. 4. В файле содержатся сведения о спортсменах: фамилия, пол, вид спорта, год рождения, рост. Найти самого высокого спортсмена, занимающегося плаванием, среди мужчин. Вывести сведения о спортсменках, выступающих в юниорском разряде (14-17 лет).
Вариант № 3 1. Дан файл, содержащий некоторый текст. В каждой фразе найти самое длинное слово и записать его в другой текстовый файл. 2. В текстовом файле хранится целочисленная матрица. Заменить в ней все отрицательные элементы минимальным, положительные – максимальным, а нулевые – разностью максимального и минимального элементов. 3. Бинарный файл содержит вещественные числа. Удалить отрицательные, в конец файла записать количество удалений. 4. Имеется файл, содержащий сведения о наличии билетов на рейсы некоторой авиакомпании. Структура записи: номер рейса, пункт назначения, время вылета, цена билета, количество свободных мест в салоне. Произвести корректировку данных в файле при продаже билетов, исходные данные – номер рейса и количество проданных билетов. Получить сведения о наличии мест, цене билета и времени вылета для определенного рейса.
Вариант № 4 1. Дан файл, содержащий некоторый текст. Удалить из этого файла лишние пробелы, оставив по одному между словами. Если слова разделяются знаком препинания без пробела, добавить пробел после знака препинания.[U11] [ОА12] Для высокого уровня сложности дополнительно требуется учет следующих правил. Однократная встреча символа «-» («HYPHEN-MINUS», «минус», код символа равен 45), окруженного слева и справа буквами (или с одной стороны соседствующего с буквой, а с другой – с цифрой) трактуется как дефис и не требует вставки пробелов. При наличии пробелов между дефисом и символами справа или слева – они удаляются. Последовательность из двух подряд идущих символов «--» трактуется как тире и отделяется от прочих символов слева и справа одним пробелом. 2. В текстовом файле хранится матрица. Записать в другой текстовый файл количество положительных, отрицательных и нулевых элементов исходной матрицы, ее среднее арифметическое значение, максимум и минимум (с позициями), наибольшее отрицательное и наименьшее положительное значение элементов матрицы (с позициями). 3. Компоненты бинарного файла – вещественные числа. Поставить последнее число из этого файла между 10-м и 11-м компонентами. Если в файле меньше одиннадцати чисел, то никаких изменений производить не требуется. 4. Бинарный файл содержит информацию о наличии семян в магазине: название растения, время (месяц) высадки, количество семян в упаковке, стоимость одной упаковки. Вывести названия растений, семена которых можно высаживать с марта по май. Провести корректировку цены для семян определенного названия.
Вариант № 5 1. Дан файл, содержащий некоторый текст. Удалить из этого файла фразы, содержащие слова с двумя буквами «О». 2. В текстовом файле хранится вещественная матрица. В каждой строке матрицы поменять минимальный элемент с первым, а максимальный – с последним и записать преобразованную матрицу в другой текстовый файл. 3. Компоненты бинарного файла – целые числа. Добавить после каждого положительного числа его квадрат, нули удалить. 4. В бинарном файле находятся сведения о животных зоопарка: название животного, природная зона, затраты на корм за один день. Вывести количество животных определенной природной зоны, находящихся в зоопарке, и определить, сколько денег тратится на содержание определенного животного в месяц.
Вариант № 6 1. Дан файл, содержащий некоторый текст. Отредактировать файл: после каждой фразы в скобках указать число слов в ней. 2. В текстовом файле хранится квадратная вещественная матрица. Заменить в ней элементы, лежащие на главной диагонали, значением последнего элемента матрицы. 3. Компоненты бинарного файла – целые числа. Удалить из этого файла максимальное и минимальное число. 4. Дан файл, содержащий сведения о поступивших в продажу автомобилях. Записи содержат следующие поля: марка автомобиля, страна-производитель, год выпуска, объем двигателя, расход бензина на 100 км, цена, количество экземпляров. Скорректировать данные об определенном автомобиле при изменении на него цены. Вывести марку автомобиля с определенным объемом двигателя и наименьшим расходом бензина.
Вариант № 7 1. Дан файл, содержащий некоторый текст. Переписать в новый текстовый файл фразы, состоящие из наибольшего количества слов. 2. В текстовом файле хранится вещественная матрица. Преобразовать ее следующим образом: в каждой четной строке увеличить вдвое элементы, стоящие на нечетных местах.[U13] [ОА14] 3. Компоненты бинарного файла – целые числа. Удалить из него все нули. Добавить в начало файла количество отрицательных компонентов, а в конец – количество положительных. 4. В файле хранится информация о курортах мира: страна, город, название отеля, класс отеля, стоимость проживания за один день, стоимость проезда в оба конца. Вывести сведения об отелях определенного класса, где стоимость проживания за неделю наименьшая. Определить среднюю стоимость тура на неделю в определенный класс отеля, включая стоимость проживания и стоимость проезда.
Вариант № 8 1. Дан файл, содержащий некоторый текст. Оставить в этом файле только те фразы, все слова в которых содержат букву «а». 2. В текстовом файле хранится квадратная целочисленная матрица. «Разорвать» эту матрицу по главной диагонали, записав в другой файл сначала элементы, находящиеся над диагональю, потом в одну строку диагональные элементы, и затем элементы, находящиеся под диагональю. Форма треугольников должна сохраниться. [U15] [ОА16] 3. Компоненты бинарного файла – целые числа. Добавить в начало файла значение -1, а в конец файла – значение, на 1 больше максимального в этом файле. 4. Дан файл, содержащий сведения о химических элементах: название, символическое обозначение, массу атома, заряд ядра. Вывести сведения о химическом элементе по его символическому названию. Найти элемент с самой большой массой.
Вариант № 9 1. Дан файл, содержащий некоторый текст. Оставить в этом файле только те фразы, в которых встречается не меньше 4 различных гласных букв[U17] [ОА18] . 2. В текстовом файле хранится вещественная матрица. Добавить в эту матрицу столбцы, содержащие суммы элементов каждой строки, их максимумы и минимумы. 3. Компоненты бинарного файла – целые числа. Удалить из этого файла все числа, расположенные между первым и последним положительными компонентами. 4. Расписание движение поездов хранится в файле и содержит информацию: пункт назначения, номер поезда, тип поезда (скорый, экспресс, пассажирский), время отправления, время в пути. Вывести сведения о поездах, отправляющихся в Москву в определенный временной период. Найти поезд определенного типа, доезжающий до Москвы за наименьшее время.
Вариант № 10 1. Дан файл, содержащий некоторый текст. Оставить в этом файле только те слова, которые содержат хотя бы одну букву «а» и не содержат букв «е». 2. В текстовом файле хранится вещественная матрица. Заменить в ней все отрицательные числа нулями. 3. Компоненты бинарного файла – беззнаковые целые числа. Удалить из этого файла все числа, являющиеся степенью числа 2.[U19] [ОА20] 4. В файле хранятся сведения о личной библиотеке: фамилия автора, название, издательство, год издания, тематика книги. Вывести названия книг определенного автора, изданных после 2000 года. Определить долю книг в библиотеке по теме «Программирование» от общего количества экземпляров.
Вариант № 11 1. Дан файл, содержащий некоторый текст. Оставить в этом файле только те фразы, которые содержат не менее трех слов. 2. В текстовом файле в табличном виде хранится информация о количестве и ценах товаров на складе. Добавить в таблицу графу с общими суммами по каждому виду товара. 3. Компоненты бинарного файла – целые числа. Удалить из этого файла все положительные числа, кратные 3, добавив в конец файла их количество. 4. В файле содержатся сведения о сотрудниках лаборатории: фамилия, год рождения, пол, образование (среднее, высшее), год поступления на работу. Найти самого старшего сотрудника среди мужчин. Вывести список молодых специалистов (до 28 лет) с высшим образованием.
Вариант № 12 1. Дан файл, содержащий некоторый текст. Удалить из него все фразы, в которых есть слова, содержащие заглавные буквы (начальную заглавную букву в предложении не учитывать). 2. В текстовом файле хранится таблица результатов сдачи студентами сессии. У таблицы есть шапка следующего вида: Фамилия, № зачетки, математика, физика, философия. Переписать в разные файлы фамилии студентов-отличников, студентов-хорошистов и студентов, получивших на экзаменах только одну тройку. 3. Компоненты бинарного файла – целые числа. Обнулить компоненты, отличающиеся от среднего арифметического значения компонент [ОА21] более чем втрое. 4. Имеется файл, содержащий сведения об экспортируемых товарах: наименование товара, страна – импортер и объем поставляемой партии в штуках. Вывести страны, в которые экспортируется определенный товар и общий объем его экспорта.
Вариант № 13 1. Дан файл, содержащий некоторый текст. Оставить в этом файле только те фразы, в которых имеется числовая информация (то есть слова, состоящие только из цифр, а для среднего и высокого уровней и сокращенная запись числительных вида "1-й"). 2. В текстовом файле хранится целочисленная матрица. Преобразовать ее в вещественную и записать в другой файл с точностью до второго знака после точки. 3. Компоненты бинарного файла – вещественные числа. Изменить содержимое файла, прибавив к каждой положительной компоненте первую, а из отрицательных компонент вычесть значение последней. 4. Результаты сдачи студентами экзаменационной сессии хранятся в файле, содержащем следующие данные: фамилия студента и оценки по физике, математике и информатике. Вывести количество двоек по каждому из предметов и вывести список студентов, имеющих двойки хотя бы по одному предмету.
Вариант № 14 1. Дан файл, содержащий некоторый текст. Оставить в этом файле только те фразы, в которых имеются слова, записанные прописными буквами. 2. Дан текстовый файл, содержащий целые числа. Увеличить значения четных чисел этого файла вдвое, остальные оставить без изменения. 3. Компоненты бинарного файла – вещественные числа. Поменять местами первый и последний отрицательные компоненты. В конец файла добавить количество отрицательных компонент. 4. В файле хранятся сведения о вкладчиках банка: номер счета, паспортные данные, категория вклада, текущая сумма вклада, дата последней операции. Зафиксировать (произвести изменения) операции приема и выдачи любой суммы. Вывести наибольшую сумму вклада в категории – “срочный”.
Вариант № 15 1. Дан файл, содержащий некоторый текст. Проверить, все ли фразы начинаются с прописной буквы. Если нет – исправить. 2. В текстовом файле хранится таблица синусов и косинусов различных углов. У таблицы есть шапка вида « x sin x cos x ». Добавить в этот файл колонки с тангенсами и котангенсами этих углов. Если значение тангенса или котангенса не определено, в соответствующей графе поставить прочерк. 3. Компоненты бинарного файла – вещественные числа. Удалить из этого файла каждое пятое число. 4. В файле содержатся сведения о пациентах глазной клиники. Структура записи: фамилия пациента, пол, возраст, место проживания (город), диагноз. Определить количество иногородних пациентов, прибывших в клинику. Вывести сведения о пациентах пенсионного возраста.
Вариант № 16 1. Дан файл, содержащий некоторый текст. Переписать в новый текстовый файл фразы-палиндромы (фразы, читающиеся одинаково слева направо и справа налево). 2. В текстовом файле хранится таблица с результатами сдачи сессии студентами одной группы. У таблицы есть шапка следующего вида: Фамилия, № зачетки, математика, физика, химия, черчение. Добавить в таблицу графу со средним баллом студента за сессию. 3. Компоненты бинарного файла – целые числа. Поменять местами первый компонент с последним, второй – с предпоследним и т.д.[U22] [ОА23] 4. В файле хранятся сведения об архитектурных памятниках: название, местоположение, тип постройки, архитектор, год постройки. Вывести сведения о сооружениях определенного типа, например, “собор”, построенных до 18 века. Найти самый старый архитектурный памятник.
Вариант № 17 1. Дан файл, содержащий некоторый текст. В новый файл записать самую длинную фразу и фразу с наибольшим количеством слов. 2. В текстовом файле хранятся вещественные числа. Удалить из этого файла каждое пятое число. 3. Компоненты бинарного файла – вещественные числа. Нормировать компоненты файла вычитанием среднего арифметического всех чисел из каждого числа. 4. Дан файл, содержащий сведения о вступительных экзаменах в ВУЗ по результатам ЕГЭ по математике, русскому и английскому языкам [U24] [ОА25] и дополнительному испытанию по профильному предмету: фамилия, баллы по предметам. Известна проходная сумма баллов. Вывести список абитуриентов, имеющих наибольшую сумму баллов по результатам ЕГЭ и дополнительному испытанию и процент абитуриентов, не выдержавших конкурса.
Вариант № 18 1. Дан файл, содержащий некоторый текст. В новый текстовый файл записать статистику по этому файлу: количество строк, фраз, слов, знаков без пробелов, знаков с пробелами,– с пояснениями, что означает каждое число[ОА26] .[U27] 2. В текстовом файле хранится вещественная матрица. Изменить матрицу: округлить все значения до первого знака после запятой. 3. Компоненты бинарного файла – целые числа. Удалить из этого файла заданное число (если встречается неоднократно, то удалить все экземпляры). Если искомого числа в файле нет, то дописать его в конец файла. 4. Дан файл, содержащий сведения об отправлении поездов дальнего следования с Московского вокзала: номер поезда, станция назначения, время отправления, время в пути, наличие билетов. Вывести номера поездов и время их отправления в определенный город в заданном временном интервале. Получить информацию о наличии билетов на поезд с определенным номером.
Вариант № 19 1. Дан файл, содержащий некоторый текст. Переписать его в новый файл по две фразы на строку. Если число фраз нечетное, то в последней строке останется одна фраза. 2. В текстовом файле хранятся упорядоченные по убыванию целые числа. Вставить в файл введенное с клавиатуры число, не нарушая упорядоченности. 3. Компоненты бинарного файла – вещественные числа. Удалить из файла те числа, которые меньше среднего арифметического всех чисел файла. 4. Имеется файл, содержащий сведения о наличии билетов на спектакли. Структура записи: название спектакля, название театра, дата, количество билетов, цена. Произвести корректировку данных в файле при продаже билетов, исходные данные – название спектакля, название театра, дата и количество проданных билетов. Вывести названия спектаклей, на которые есть билеты на указанную дату.
Вариант № 20 1. Дан файл, содержащий некоторый текст. Удалить из него фразы, содержащие слова, состоящие только из гласных букв. 2. Компоненты текстового файла – вещественные числа. Поменять местами первый и последний отрицательные компоненты. В конец файла добавить среднее арифметическое отрицательных компонент. 3. В типизированном файле хранятся упорядоченные по возрастанию вещественные числа. Вставить в файл введенное с клавиатуры число, не нарушая упорядоченности. 4. Бинарный файл содержит перечень монет нумизматической коллекции. Структура записи: год чеканки, страна, металл, номинал, количество, рыночная стоимость. Определить суммарную стоимость коллекции. Вывести сведения о монетах, выпущенных ранее указанного века.

Контрольные вопросы

1. Что такое файл с точки зрения информатики и вычислительной техники?

2. Что такое файл с точки зрения языка [ОА28] программирования С[U29] ?

3. Какие виды файлов Вы знаете?

4. В чем отличие текстового файла от бинарного и от чего это зависит наличие этого различия?

5. Что такое поток?

6. Что такое признак окончания файла? Для каких файлов он существует?[U30] [ОА31]

7. Как инициализировать поток?

8. Что такое структурный тип?

9. Какая функция отвечает за открытие потока? Какие у нее параметры?

10. Какие режимы открытия файла Вы знаете? В чем их отличия друг от друга?

11. Какие ошибки могут возникнуть при открытии файла?

12. В каком случае указатель на поток принимает значение NULL?

13. Какая функция отвечает за закрытие файла? Какие у нее параметры?

14. Зачем закрывать файл?

15. Сколько раз можно открыть файл в программе?[U32] [ОА33]

16. Какие функции используются для ввода-вывода данных при работе с текстовыми файлами?

17. Какие функции используются для ввода-вывода данных при работе с бинарными файлами?

18. В чем отличие функции fprintf() от функции fread(), а функции fscanf() от fwrite()?

19. Как определить текущую позицию указателя на поток?

20. Как переместить указатель на поток из текущей позиции в заданную?

21. За что отвечает константа EOF? Как и где ее можно использовать?

22. Какие основные функции для работы с файлами Вы знаете?

23. С помощью каких функций можно осуществлять побайтовую обработку файлов?

24. Для чего используются функции rename() и remove()? Нужно ли при работе с ними объявлять файловый указатель?

25. Можно ли удалить или переименовать открытый файл?

 

ПРИЛОЖЕНИЕ 1

Примеры обработки текстовых и бинарных файлов

Пример 1. Побайтовая обработка файлов с использованием функций getc() и putc(). В комментариях описано поведение программы при выполнении под управлением ОС MS Windows в консольном режиме (кодовая страница (code page) OEM 866).

Он же показывает, чем отличаются текстовые и двоичные файлы в Windows XP.

#include <stdio.h>

#include <stdlib.h>

 

int main(int argc, char *argv[])

{

FILE *fp = NULL;

char alphabet[]="ABXZ";

char buf[100];

int i=-100;

int rdint=-1;

int abcount = 0;

{

int i=0;

memset(buf,0,100);

while(alphabet[i])

buf[i]=alphabet[i++];

abcount = i;

}

printf("i = %d abcount = %d\n",i,abcount);

 

fp = fopen("file1.dat","w"); /* открываем файл как текстовый, создаваемый

заново и доступный только для записи */

if(fp != NULL)

{

printf("after fopen() fp = %p \n",fp);

for(i=0; i < abcount; i++)

putc(buf[i], fp);

putc('\0', fp); /* Символ '\0' записан в текстовый файл без изменений:

1 байт, его шестнадцатеричное значение 00 */

putc('\n', fp); /* Вместо символа '\n' (перевод строки) в текстовый файл

записана последовательность из двух байт: в шестнадцатеричном представлении: 0D 0A в десятичном представлении: 13 10 обозначения: CR LF – Возврат_Каретки Перевод_Строки */

putc('z', fp);

putc('\r', fp); /*Одиночный символ '\r' (Возврат_Каретки)

записан в ТЕКСТОВЫЙ файл без изменений:

1 байт, его шестнадцатеричное значение 0D */

putc('a', fp);

}

fclose(fp);

printf("after fclose() fp = %p \n",fp);

system("PAUSE");

 

fp = fopen("file2.txt","wbsdgfrtg"); /* открываем файл, указывая признак

бинарного файла – буква "b" после указания собственно режима. То есть требуется обрабатывать внешний файл как бинарный файл, создаваемый заново и доступный только для записи. Все дополнительные символы после b в строке режима игнорируются*/

if(fp != NULL)

{

for(i=0; i < abcount; i++)

putc(buf[i], fp);

putc('\0', fp); /* Символ '\0' записан в бинарный файл без изменений:

1 байт, его шестнадцатеричное значение 00*/

putc('\n', fp); /* Cимвол '\n' записан в бинарный файл без изменений:

1 байт, его шестнадцатеричное значение 0A

десятичное представление: 10

обозначение: LF – Перевод_Строки (также встречается

обозначение NL – Новая_Строка) */

putc('z', fp);

putc('\r', fp); /*Одиночный символ '\r' (Возврат_Каретки)

записан в бинарный файл без изменений:

1 байт, его шестнадцатиричное значение 0D */

putc('a', fp);

}

fclose(fp);

system("PAUSE");

system("CLS");

printf("Read chars from file1.dat, open as text:\n");

fp = fopen("file1.dat","r");

if(fp != NULL)

{

while( (rdint = getc(fp)) != EOF)

printf("Readed code as decimal: %3d as hex: %02x As char: %c _*+*+*_ \n",

rdint, rdint, (char)rdint);

}

fclose(fp);

 

printf("Read chars from file1.dat, open as binary:\n");

fp = fopen("file1.dat","rb");

if(fp != NULL)

{

while( (rdint = getc(fp)) != EOF)

printf("Readed code as decimal: %3d as hex: %02x As char: %c _*+*+*_ \n",

rdint, rdint, (char)rdint);

}

fclose(fp);

 

system("PAUSE");

system("CLS");

 

printf("Read chars from file2.txt, open as text:\n");

fp = fopen("file2.txt","rt");

if(fp != NULL)

{

while( (rdint = getc(fp)) != EOF)

printf("Readed code as decimal: %3d as hex: %02x As char: %c _*+*+*_ \n",

rdint, rdint, (char)rdint);

}

fclose(fp);

 

printf("Read chars from file1.dat, open as binary:\n");

fp = fopen("file2.txt","rb");

if(fp != NULL)

{

while( (rdint = getc(fp)) != EOF)

printf("Readed code as decimal: %3d as hex: %02x As char: %c _*+*+*_ \n",

rdint, rdint, (char)rdint);

}

fclose(fp);

 

system("PAUSE");

return 0;

}

 

Пример 2. Поблочная обработка файлов с использованием функций fread() и fwrite(). В комментариях описано поведение программы при выполнении под управлением ОС MS Windows в консольном режиме (code page OEM 866).

Во-вторых, с помощью функций прямого ввода можно также работать как с текстовыми, так и с двоичными файлами –. И этот пример показывает, что при прямой записи в файл, открытый как текстовый, и прямом чтении из файла, открытого как текстового, происходят те же преобразования, что и при посимвольной работе с файлом. Точно такие же преобразования происходят и при построчной работе с текстовыми файлами в системах, делающих различие между двоичными и текстовыми файлами.[ОА34]

#include <stdio.h>

#include <stdlib.h>

 

int main(int argc, char *argv[])

{

FILE *fp = NULL;

char alphabet[]="ABCD";

char buf[100], buf2[100];

int i=-100;

int rdint=-1;

int abcount = 0;

{

int i=0;

memset(buf,-1,100);

while(alphabet[i])

buf[i]=alphabet[i++];

 

buf[i++] = '\0';

buf[i++] = '\n';

buf[i++] = 'Z';

buf[i++] = '\r';

buf[i++] = 'U';

abcount = i;

}

printf("i = %d abcount = %d\n",i,abcount);

 

fp = fopen("file1.dat","w");

if(fp != NULL)

{

printf("after fopen() fp = %p \n",fp);

printf("In text file: fwrite() = %d",fwrite(buf,1,abcount + 4, fp));

system("PAUSE");

fclose(fp);

}

 

printf("after fclose() fp = %p \n",fp);

system("PAUSE");

 

fp = fopen("file2.txt","wb"); /* открываем файл как бинарный, создаваемый

заново и доступный только для записи */

if(fp != NULL)

{

printf("after fopen() fp = %p \n",fp);

printf("In text file: fwrite() = %d",fwrite(buf,1,abcount + 4, fp));

system("PAUSE");

fclose(fp);

}

 

system("PAUSE");

system("CLS");

memset(buf,-1,100);

printf("Read abcount+4 bytes from file1.dat to buf2, open as text:\n");

fp = fopen("file1.dat","r");

if(fp != NULL)

{

printf("From file1.dat to buf2 as text: fread() = %d",

fread(buf2,1,abcount + 4, fp));

for(i = 0; i < abcount + 4; i++)

printf("Readed code as decimal: %3d as hex: %02x As char: %c _*+*+*_ \n",

buf2[i], buf2[i], (char)(buf2[i]));

}

fclose(fp);

memset(buf,-1,100);

printf("Read abcount+4 bytes from file1.dat to buf2, open as binary:\n");

fp = fopen("file1.dat","rb");

if(fp != NULL)

{

printf("From file1.dat to buf2 as binary: fread() = %d",

fread(buf2,1,abcount + 4, fp));

for(i = 0; i < abcount + 4; i++)

printf("Readed code as decimal: %3d as hex: %02x As char: %c _*+*+*_ \n",

buf2[i], buf2[i], (char)(buf2[i]));

}

fclose(fp);

 

system("PAUSE");

system("CLS");

 

memset(buf,-1,100);

printf("Read abcount+4 bytes from file2.txt to buf2, open as text:\n");

fp = fopen("file2.txt","rt");

if(fp != NULL)

{

printf("From file2.txt to buf2 as text: fread() = %d",

fread(buf2,1,abcount + 4, fp));

for(i = 0; i < abcount + 4; i++)

printf("Readed code as decimal: %3d as hex: %02x As char: %c _*+*+*_ \n",

buf2[i], buf2[i], (char)(buf2[i]));

}

fclose(fp);

 

memset(buf,-1,100);

printf("Read abcount+4 bytes from file2.txt to buf2, open as binary:\n");

fp = fopen("file2.txt","rb");

if(fp != NULL)

{

printf("From file2.txt to buf2 as binary: fread() = %d",

fread(buf2,1,abcount + 4, fp));

for(i = 0; i < abcount + 4; i++)

printf("Readed code as decimal: %3d as hex: %02x As char: %c _*+*+*_ \n",

buf2[i], buf2[i], (char)(buf2[i]));

}

fclose(fp);

 

system("PAUSE");

return 0;

}

Пример 3. Использование функции fseek(). В комментариях описано поведение программы при выполнении под управлением ОС MS Windows в консольном режиме (code page OEM 866).

#include <cstdlib>

#include <iostream>

 

using namespace std;

 

int main(int argc, char *argv[])

{

FILE *fp = NULL;

char alphabet[]="ABCDEF";

char buf[100];

int i=-100;

int rdint=-1;

int abcount = 0;

{

int i=0;

memset(buf,-1,100);

while(alphabet[i])

buf[i]=alphabet[i++];

buf[i++] = '\0';

buf[i++] = '\n';

buf[i++] = 'Z';

buf[i++] = '\r';

buf[i++] = 'U';

abcount = i;

}

printf("i = %d abcount = %d\n",i,abcount);

 

fp = fopen("file1.dat","w");

if(fp != NULL)

{

printf("after fopen() fp = %p \n",fp);

printf("In text file: fwrite() = %d",fwrite(buf,1,abcount + 1, fp));

system("PAUSE");

fclose(fp);

}

 

printf("after fclose() fp = %p \n",fp);

system("PAUSE");

 

fp = fopen("file2.txt","wb"); /* открываем файл, указывая

признак бинарного файла – буква "b" в конце строки режима доступа, после указания собственно режима. То есть требуется обрабатывать внешний файл как "бинарный файл", создаваемый заново и доступный только для записи*/

if(fp != NULL)

{

printf("after fopen() fp = %p \n",fp);

printf("In binary file: fwrite() = %d",fwrite(buf,1,abcount, fp));

system("PAUSE");

fclose(fp);

}

 

printf("file1.dat as text:\n");

fp = fopen("file1.dat","r+");

if(fp != NULL)

{

printf("fseek(fp, 3, SEEK_SET) = %d\n", fseek(fp, 3, SEEK_SET));

if( (rdint = getc(fp)) != EOF)

printf("Readed code as decimal: %3d as hex: %02x As char: %c _*+*+*_ \n",

rdint, rdint, (char)rdint);

 

printf("fseek(fp, -2, SEEK_CUR) = %d\n", fseek(fp, -2, SEEK_CUR));

if( (rdint = getc(fp)) != EOF)

printf("Readed code as decimal: %3d as hex: %02x As char: %c _*+*+*_ \n",

rdint, rdint, (char)rdint);

 

printf("fseek(fp, 5, SEEK_CUR) = %d\n", fseek(fp, 5, SEEK_CUR));

if( (rdint = getc(fp)) != EOF)

printf("Readed code as decimal: %3d as hex: %02x As char: %c _*+*+*_ \n",

rdint, rdint, (char)rdint);

 

printf("fseek(fp, -9, SEEK_END) = %d\n", fseek(fp, -9, SEEK_END));

if( (rdint = getc(fp)) != EOF)

printf("Readed code as decimal: %3d as hex: %02x As char: %c _*+*+*_ \n",

rdint, rdint, (char)rdint);

 

system("PAUSE");

fclose(fp);

}

 

printf("file1.dat as binary:\n");

fp = fopen("file1.dat","r+b");

if(fp != NULL)

{

printf("fseek(fp, 3, SEEK_SET) = %d\n", fseek(fp, 3, SEEK_SET));

if( (rdint = getc(fp)) != EOF)

printf("Readed code as decimal: %3d as hex: %02x As char: %c _*+*+*_ \n",

rdint, rdint, (char)rdint);

 

printf("fseek(fp, -2, SEEK_CUR) = %d\n", fseek(fp, -2, SEEK_CUR));

if( (rdint = getc(fp)) != EOF)

printf("Readed code as decimal: %3d as hex: %02x As char: %c _*+*+*_ \n",

rdint, rdint, (char)rdint);

 

printf("fseek(fp, 5, SEEK_CUR) = %d\n", fseek(fp, 5, SEEK_CUR));

if( (rdint = getc(fp)) != EOF)

printf("Readed code as decimal: %3d as hex: %02x As char: %c _*+*+*_ \n",

rdint, rdint, (char)rdint);

 

printf("fseek(fp, -9, SEEK_END) = %d\n", fseek(fp, -9, SEEK_END));

if( (rdint = getc(fp)) != EOF)

printf("Readed code as decimal: %3d as hex: %02x As char: %c _*+*+*_ \n",

rdint, rdint, (char)rdint);

 

system("PAUSE");

fclose(fp);

}

printf("file2.dat as text:\n");

fp = fopen("file2.txt","r+");

if(fp != NULL)

{

printf("fseek(fp, 3, SEEK_SET) = %d\n", fseek(fp, 3, SEEK_SET));

if( (rdint = getc(fp)) != EOF)

printf("Readed code as decimal: %3d as hex: %02x As char: %c _*+*+*_ \n",

rdint, rdint, (char)rdint);

 

printf("fseek(fp, -2, SEEK_CUR) = %d\n", fseek(fp, -2, SEEK_CUR));

if( (rdint = getc(fp)) != EOF)

printf("Readed code as decimal: %3d as hex: %02x As char: %c _*+*+*_ \n",

rdint, rdint, (char)rdint);

 

printf("fseek(fp, 5, SEEK_CUR) = %d\n", fseek(fp, 5, SEEK_CUR));

if( (rdint = getc(fp)) != EOF)

printf("Readed code as decimal: %3d as hex: %02x As char: %c _*+*+*_ \n",

rdint, rdint, (char)rdint);

 

printf("fseek(fp, -9, SEEK_END) = %d\n", fseek(fp, -9, SEEK_END));

if( (rdint = getc(fp)) != EOF)

printf("Readed code as decimal: %3d as hex: %02x As char: %c _*+*+*_ \n",

rdint, rdint, (char)rdint);

 

system("PAUSE");

fclose(fp);

}

 

printf("file2.txt as binary:\n");

fp = fopen("file2.txt","r+b");

if(fp != NULL)

{

printf("fseek(fp, 3, SEEK_SET) = %d\n", fseek(fp, 3, SEEK_SET));

if( (rdint = getc(fp)) != EOF)

printf("Readed code as decimal: %3d as hex: %02x As char: %c _*+*+*_ \n",

rdint, rdint, (char)rdint);

 

printf("fseek(fp, -2, SEEK_CUR) = %d\n", fseek(fp, -2, SEEK_CUR));

if( (rdint = getc(fp)) != EOF)

printf("Readed code as decimal: %3d as hex: %02x As char: %c _*+*+*_ \n",

rdint, rdint, (char)rdint);

 

printf("fseek(fp, 5, SEEK_CUR) = %d\n",

fseek(fp, 5, SEEK_CUR));

if( (rdint = getc(fp)) != EOF)

printf("Readed code as decimal: %3d as hex: %02x As char: %c _*+*+*_ \n",

rdint, rdint, (char)rdint);

 

printf("fseek(fp, -9, SEEK_END) = %d\n", fseek(fp, -9, SEEK_END));

if( (rdint = getc(fp)) != EOF)

printf("Readed code as decimal: %3d as hex:

%02x As char: %c _*+*+*_ \n",

rdint, rdint, (char)rdint);

 

system("PAUSE");

fclose(fp);

}

return EXIT_SUCCESS;

}

 

[U1]Думаю, этот вариант должен подойти для всех тех, кто не занимается программированием на достаточно низком системном уровне. А кто занимается – должен суметь разобраться в нюансах самостоятельно.

1) Не различаются. То есть удаляем и Мама, и мама, и МАМА.

2) [ОА2]Или русские, или латинские. Вариант maма должен остаться в файле

1) [ОА3]Классика жанра - создавать новый файл с последующим удалением старого и переименованием. На этапе отладки и тестирования старый файл не удаляется.

2) Считывать все содержимое в оперативную память нет необходимости, но для низкого уровня я это допускаю, пусть сделают хоть как-нибудь

[U4]Думаю, что здесь все однозначно будет понято студентами: изменение данных прямо в файле (fopen("","r+b"); ... fflush() )

[ОА5]Пусть делают как хотят: хоть изменением исходного, хоть созданием нового. А выбор алгоритма обосновывают на защите лр

[ОА6]Конструктор – название игрушки

[U7]При этом варианты написания "КОНСТРУКТОР", "конструктор", "Конструктор" и "КоНсТруктОр" и другие аналогичные для поиска самого дорогого считаются одним и тем же названием.

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

[U8]По значению, по начертанию или по коду?

[ОА9]По значению

[U10]То есть, различаем русские и английские, но не различаем большие и маленькие среди тех или других?

[U11]Для низкого уровня -- видимо эта часть задания игнорируется. А для высокого -- можно указать на разницу между одним "-" -- "дефисом "(который не разделяет слова) и двумя подряд "--" -- "тире" -- который отделяется пробелами с двух сторон.

[ОА12]Согласна, но как это записать?

[U13]Считать четность и нечетность "по-порядку" ("по-метматически") с единицы или по "по-индексам" с нуля?

[ОА14]Математически. Я вообще сторонница читать все математически, и студентам все время повторяю, что индекс элемента и его порядковый номер – не одно и то же

[U15]Количество пробелов и/или табуляций между числами тоже должно сохраниться?

[ОА16]Думаю, что это можно требовать только на высоком уровне сложности

[U17]Для среднего и высокого уровня -- гласные буквы кириллицы и латиницы различаются?

[ОА18]Да, потому что принадлежат разным алфавитам

Степень 0 -- число 1 считается?

[U19]Интересно, на каком уровне сложности следует требовать оптимизацию по времени -- проверку за такое число операций, которое не более числа значащих бит в числе?.

1) [ОА20]Число 1 считается.

2) На высоком

[ОА21]В три раза больше или в три раза меньше

c > 3* sr || 3*c<sr

[U22]Следует ли считать ошибкой попытку поменть с самим собой средний элемент файла с нечетным числом элементов?

[ОА23]Количество перестановок обычно считают равным N/2, при нечетном N результат будет таким, что перестановка элемента с самим собой выполняться не будет

[U24]А от замены с самим собой что-то изменится? Если на конечный результат не влияет, думаю, одну лишнюю замену можно ошибкой не считать. К тому же при целочисленном делении нечетного числа пополам мы и получим количество перестановок, которое не будет учитывать этот неизменяемый средний элементПо-моему, это частный случай профильного предмета. Который нынче, вроде, тоже из ЕГЭ берется -- из предметов "по выбору".

[ОА25]Имеются в виду результаты трех ЕГЭ (математика, русский, английский) и доп. испытанию, которое проводит сам вуз. Например, такая возможность есть у СПГУ

[ОА26]Думаю, язык пояснений роли не играет

[U27]Думаю, что не играет только для низкого уровня сложности. А для среднего и высокого – обязательно на русском в той же кодовой странице что и исходный файл, по умолчанию для консольного приложения MS Windows – OEM 866. Особо жаждущие выделиться на высоком уровне могут запросить в качестве дополнительного параметра программы способ кодирования для результирующего файла: OEM 866, cp1251 или utf8. За грамотно реализованное последнее можно и что-нибудь не спросить.

[ОА28] мне эта формулировка кажется несколько странной…

[U29]Мое понимание: это то, с чем может быть связан поток. А с чем может быть связан поток -- определяется операционной системой. Причем уже в первых unix-системах это был не только файл из первого вопроса ("поименованная совокупность данных на внешнем носителе").

[U30]Который нынче в самих файлах встречается редко, но из-за которого функция getc() возвращает такой странный набор значений. Что здесь слеудет ожидать в качестве правильного ответа? И как быть с функцией feof()?

1) [ОА31]Размышления на тему

2) Что касается функции feof(), то я вообще не знаю, как правильно с ней поступить. Потому как проблемы с ней возникают достаточно часто даже в текстовых файлах. Кстати, мне по этому поводу совершенно не нравится указание в теоретической части, что именно эту функцию нужно использовать для проверки достижения конца файла

[U32]Один и тот же или разные? И если первое, то возможно большое количество вариантов, в зависимости от режима доступа.

[ОА33]На мой взгляд, файл можно открывать сколько угодно раз, если не забывать его перед этим закрывать…

[ОА34]Возможен перенос в приложение





©2015 www.megapredmet.ru Все права принадлежат авторам размещенных материалов.