ПОЗНАВАТЕЛЬНОЕ Сила воли ведет к действию, а позитивные действия формируют позитивное отношение Как определить диапазон голоса - ваш вокал
Игровые автоматы с быстрым выводом Как цель узнает о ваших желаниях прежде, чем вы начнете действовать. Как компании прогнозируют привычки и манипулируют ими Целительная привычка Как самому избавиться от обидчивости Противоречивые взгляды на качества, присущие мужчинам Тренинг уверенности в себе Вкуснейший "Салат из свеклы с чесноком" Натюрморт и его изобразительные возможности Применение, как принимать мумие? Мумие для волос, лица, при переломах, при кровотечении и т.д. Как научиться брать на себя ответственность Зачем нужны границы в отношениях с детьми? Световозвращающие элементы на детской одежде Как победить свой возраст? Восемь уникальных способов, которые помогут достичь долголетия Как слышать голос Бога Классификация ожирения по ИМТ (ВОЗ) Глава 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]Возможен перенос в приложение |