- •Раздел 1. Языки программирования
- •Программное обеспечение. Основные этапы решения задач на эвм. Жизненный цикл программного средства.
- •7. Решение задачи на эвм и анализ результатов
- •Основная структура программы.
- •Эквивалентность типов
- •Преобразование типов
- •Разбор программы
- •1.3. Логический тип. Ветвления. Оператор условного перехода. Полная и сокращённая форма условного оператора. Составные условия
- •1.4 Символьный тип и функции для обработки символьного типа. Перевод символьного представления числа в целый тип.
- •1.5 Оператор выбора
- •1.6. Операторы цикла. Оператор цикла с предусловием. Оператор цикла с постусловием. Оператор цикла с параметром
- •1.7 Процедуры и функции. Параметры, локальные и глобальные переменные. Передача параметров по адресу и по значению.
- •Локальные и глобальные переменные
- •Регулярный тип (массивы). Описание массивов. Ввод и вывод элементов массива. Нахождение максимального (минимального) элемента массива.
- •Обработка матриц. Поиск заданного элемента в матрице.
- •Работа с динамическими переменными. Динамические массивы.
- •1.11. Файловый ввод-вывод. Работа с текстовыми и двоичными файлами.
- •Чтение файла при помощи fgetc. Функция fgetc применяется для чтения символа из потока.
- •Чтение файла при помощи fgets
- •Запись в файл при помощи fwrite
- •1.12. Микропроцессор Intel х86. Регистры. Команды обмена данными. Команды работы со стеком.
- •1.13 Микропроцессор Intel х86. Арифметические команды. Логические команды и команды сдвига. Команды передачи управления.
- •Двоичная арифметика
- •Десятичная арифметика
- •Логические операции
- •Сдвиговые операции
- •Команды передачи управления
- •1.14 Микропроцессор Intel х86. Способы адресации: регистровая, непосредственная, прямая, косвенная. Регистровая адресация
- •Непосредственная адресация
- •Прямая адресация
- •Косвенная адресация
1.11. Файловый ввод-вывод. Работа с текстовыми и двоичными файлами.
Язык программирования Си поддерживает множество функций стандартных библиотек для файлового ввода и вывода. Эти функции составляют основу заголовочного файла стандартной библиотеки языка Си <stdio.h>.
Функциональность ввода-вывода языка Си по текущим стандартам реализуется на низком уровне. Язык Си абстрагирует все файловые операции, превращая их в операции с потоками байтов, которые могут быть как "потоками ввода", так и "потоками вывода". В отличие от некоторых ранних языков программирования, язык Си не имеет прямой поддержки произвольного доступа к файлам данных; чтобы считать записанную информацию в середине файла, программисту приходится создавать поток, ищущий в середине файла, а затем последовательно считывать байты из потока.
Потоковая модель файлового ввода-вывода была популяризирована во многом благодаря операционной системе Unix, написанной на языке Си. Большая функциональность современных операционных систем унаследовала потоки от Unix, а многие языки семейства языков программирования Си унаследовали интерфейс файлового ввода-вывода языка Си с небольшими отличиями (например, PHP). Стандартная библиотека C++ отражает потоковую концепцию в своем синтаксисе.
Файл открывается при помощи fopen, которая возвращает информацию потока ввода-вывода, прикрепленного к указанному файлу или другому устройству, с которого идет чтение (или в который идет запись). В случае неудачи функция возвращает нулевой указатель.
Функция freopen закрывает текущий файл, связанный с потоком fp, и переназначает этот поток в файл, определяемый path-именем. Эта функция обычно применяется для переадресации предоткрытых потоков stdin, stdout, stderr, stdaux, stdprn в файлы, определяемые пользователем. Новый файл, связанный с потоком, открывается в режиме mode.
Они определяются как:
FILE *fopen(const char *path, const char *mode);
FILE *freopen(const char *path, const char *mode, FILE *fp);
Функция fopen по сути представляет собой "обертку" более высокого уровня системного вызова open операционной системы Unix. Аналогично, fclose является оберткой системного вызова Unix close, а сама структура FILE языка Си зачастую обращается к соответствующему файловому дескриптору Unix. В POSIX-окружении[ Portable Operating System Interface for Unix — Переносимый интерфейс операционных систем Unix — набор стандартов, описывающих интерфейсы между операционной системой и прикладной программой.] функция fopen может использоваться для инициализации структуры FILE файловым дескриптором. Тем не менее, файловые дескрипторы как исключительно Unix-концепция не представлены в стандарте языка Си.
Параметр mode (режим) для fopen и freopen должен быть строковый и начинаться с одной из следующих последовательностей:
режим |
описание |
начинает с.. |
||
r |
rb |
|
открывает для чтения |
начала |
w |
wb |
|
открывает для записи (создает файл в случае его отсутствия). Удаляет содержимое и перезаписывает файл. |
начала |
a |
ab |
|
открывает для добавления (создает файл в случае его отсутствия) |
конца |
r+ |
rb+ |
r+b |
открывает для чтения и записи |
начала |
w+ |
wb+ |
w+b |
открывает для чтения и записи. Удаляет содержимое и перезаписывает файл. |
начала |
a+ |
ab+ |
a+b |
открывает для чтения и записи (добавляет в случае существования файла) |
конца |
Значение "b" зарезервировано для двоичного режима С. Стандарт языка Си описывает два вида файлов — текстовые и двоичные — хотя операционная система не требует их различать. Текстовый файл - файл, содержащий текст, разбитый на строки при помощи некоторого разделяющего символа окончания строки или последовательности (в Unix - одиночный символ перевода строки; в Microsoft Windows за символом перевода строки следует знак возврата каретки). При считывании байтов из текстового файла, символы конца строки обычно связываются (заменяются) с переводом строки для упрощения обработки. При записи текстового файла одиночный символ перевода строки перед записью связывается (заменяется) с специфичной для ОС последовательностью символов конца строки. Двоичный файл - файл, из которого байты считываются и выводятся в "сыром" виде без какого-либо связывания (подстановки).
При открытом файле в режиме обновления ( '+' в качестве второго или третьего символа аргумента обозначения режима) и ввод и вывод могут выполняться в одном потоке. Тем не менее, запись не может следовать за чтением без промежуточного вызова fflush или функции позиционирования в файле (fseek, fsetpos или rewind), а чтение не может следовать за записью без промежуточного вызова функции позиционирования в файле.
Режимы записи и добавления пытаются создать файл с заданным именем, если такого файла еще не существует. Как указывалось выше, если эта операция оканчивается неудачей, fopen возвращает NULL.
Закрытие файла осуществляется с помощью функции fclose . Функция fclose принимает один аргумент: указатель на структуру FILE потока для закрытия.
int fclose(FILE *fp);
Функция возвращает нуль в случае успеха и EOF в случае неудачи. При нормальном завершении программы функция вызывается автоматически для каждого открытого файла.