МУ_ЛР7_ОП (1079938), страница 2
Текст из файла (страница 2)
FILE *stdin; // Стандартный ввод данных, умолчание клавиатура
FILE *stdout; // Стандартный вывод данных, умолчание экран монитора
FILE *stderr; // Стандартный вывод информацмм об ошибках, умолчание экран монитора
Где FILE специальная структура для работы с файлами. В частности в нее записывается уникальный дескриптор (см. ниже) открытого файла.
7 Имена и расширения файлов
В файловой системе компьютера файлы хранятся в каталогах, размеры которых ограничены только физическими возможностями жестких дисков (HDD). В разных каталогах могут быть записаны одноименные файлы, наличие файлов с одинаковыми именами в одном каталоге недопустимо. Суммарный размер хранимых файлов не может превышать размер физического жесткого диска.
Имя конкретного файла в ОС задается текстовой строкой в формате:
<имя файла>[.<расширение имени файла>]
Имя файла – это основное название файла, необходимое для поиска и использования файла. Расширение имени файла (необязательная часть) указывает на тип файла, его структуру и может быть использовано в программах для контроля содержания файла. Ранее в операционных системах и файловых системах старого поколения для имени файла можно было выделить до 8-ми символов, а по расширение до 3-х символов (структура “8.3”). В настоящее время ограничения на длину файла и его расширения практически сняты: сначала до 32 символов (FAT32), а затем до 255 символов (NTFS). В ОС типа Unix допустимый размер имени файла еще выше, хотя, отметим, практически это редко используется.
Примеры имен файлов приведены выше:
Winword.exe – имя программы MS WORD,
“Отчет по ЛР студента Петрова группы ИУ5-31.DOC” – имя документа,
“Баллада о детстве - В.Высоцкий.mp3” – имя звукового файла,
DATABASE.MDB – файл БД MS Access.
Sample.txt – двоичный текстовый файл.
Пример – имя файла без расширения.
В кавычках взяты длинные имена файлов, в которых присутствуют пробелы.
8 Открытие и закрытие файлов
Для работы с файлом программа и ОС должны проверить следующее:
-
существует ли файл с заданным именем в указанном каталоге,
-
доступен ли он для работы в программе, и в каких допустимых режимах,
-
не занят ли файл в данное время другой задачей, если система многозадачная,
-
и т.д.
Такие действия выполняются специальными командами и функциями, которые под управлением ОС, и называются открытием файла (open file). Если файл успешно открыт, то он становиться доступным для работы в программе в заданном режиме. Если файл не открыт, то необходимо искать ошибку открытия и ее причину. После успешного открытия файла ОС выделяет для этого файла специальный дескриптор файла (передает в программу в структуру FILE) и специальный блок описания файла (FCB – File Control Block). Блок FCB – операционная система использует для контроля использования файла.
После работы с файлом он должен быть закрыт. Ос освобождает файл для дальнейшего использования, удаляет блок FCB. Функции библиотеки ввода и вывода fclose и _close и другие применяют для открытия файлов. Функция открытия файлов имеет следующий прототип:
FILE *fopen( <Имя файла>, <Режим открытия файла>);
Имя файла мы уже обсуждали, оно задается строкой, а режим открытия файлов может быть задан так:
"r" - открыть текстовый файл только для чтения, если файла нет то ошибка.
"w" - открыть или создать текстовый файл для записи, для созданных файлов содержимое очищается.
"a" - открыть текстовый файл для добавления записей в его конец, файл создается, если он не был создан.
"rb" - открыть ,бинарный файл только для чтения, если файла нет то ошибка.
"wb" - открыть или создать бинарный файл для записи, для созданных файлов содержимое очищается.
"ab" - открыть бинарный файл для добавления записей в его конец, файл создается, если он не был создан.
"r+" - открыть текстовый файл для чтения и записи, если файла нет то ошибка.
"w+"- открыть или создать текстовый файл для чтения и записи, для созданных файлов содержимое очищается.
"a+" - открыть текстовый файл для чтения записей или добавления записей в его конец, файл создается, если он не был создан.
"r+b" - открыть бинарный файл для чтения и записи, если файла нет то ошибка.
"w+b"- открыть или создать бинарный файл для чтения и записи, для созданных файлов содержимое очищается.
"a+b" - открыть бинарный файл для чтения записей или добавления записей в его конец, файл создается, если он не был создан.
Примеры функций для открытия файлов в разных режимах:
FILE *pF; // Структура описания файлов
pF = fopen( "fputc.out" , "w+"); // Открытие текстового файла для записи и чтения
pF = fopen( "fputc.out" , "r"); // Открытие для записи
pF = fopen( "fwrite.out" , "r+b"); // Открытие двоичного файла для записи и чтения
pF = fopen( "fprintf.out" , "w+b"); // Открытие или создание двоичного файла для чтения и записи
pFBin = _open( "write.bin", _O_RDWR |_O_BINARY ); // Открытие двоичного для прямого доступа
Для закрытия файлов можно использовать следующие обращения к функциям:
fclose(pF); // закрытие текстового файла
_close( pFBin ); // закрытие бинарного/двоичного файла
9 Библиотеки и заголовочные файлы
Заголовочными файлами в системе программирования базового языка СИ для библиотек ввода и вывода являются следующие файлы:
#include <stdio.h> // Основная библиотека ввода и вывода Си - RTL
#include <fcntl.h> // Константы ввода и вывода
#include <io.h> // Функции низкоуровневого ввода и вывода
#include <conio.h> // Консольный ввод и вывод
#include <sys/types.h> // Константы в/в
#include <sys/stat.h> // Константы в/в
Содержание этих библиотек можно узнать: изучив документацию и литературу [ 1,2, 11], посмотреть примеры данных МУ к ЛР, или обратиться для помощи в MSDN [4] локальной и Интернет версии. Можно также открыть сам заголовочный файл (он имеет текстовый формат) и изучить его самостоятельно (!!!).
10 Основные операции и функции для работы с файлами
Операции над файлами могут быть разделены на две группы:
-
Операции на содержимом конкретного файла и
-
Операции над файлом в целом.
Для работы с содержимым файла предусматриваются следующие основные операции и функции:
-
Создание файла, обычно происходит при открытии файла (open, fopen, create).
-
Открытие файла (_open, fopen).
-
Закрытие файла (_close, fclose).
-
Операция чтения из файла (_read, fread, fgetc, fgets, fscanf).
-
Операция записи в файл (_write, fwrite, fputc, fputs, fprintf ).
-
Перемещение текущего указателя файла и его определение (fsetpos , fseek).
-
Определение конца файла (_eof, feof)
-
Получение дескриптора файла (_fileno).
Для работы с файлами в целом предусматриваются следующие основные операции и функции:
-
Переименование файла (rename)
-
Удаление файла (remove)
-
Установка и изменение атрибутов файла (chmod, access).
-
Определение размера файла (_filelength)
-
Определение имени файла и его расположения (_fullpach, div)
-
Изменение потока (reopen)
-
Системные команды для работы с файлами (system).
Для чтения и записи используются различные возможности и функции. Работа с файлами возможна на основе стандартной библиотеки Run-Time Libraries (CRT) или библиотек потокового ввода вывода Standard C++ Library (STL). Эти библиотеки необходимо внимательно изучить и использовать при программировании. Здесь ограничимся конкретным примером для создания, чтения и записи файла. Для первого знакомства с библиотеками приводим примеры некоторых функций для работы с файлами. Комментарии в тексте примеров поясняют работу вызываемых функций ввода и вывода.
FILE *pF; // Описание указателя – дескриптора файла pF
pF= fopen("test.txt" , "w+"); // открытие файла для записи и создания
fputs("Пример вывода строки!!!" , pF); // вывод в файл строки
fclose(pF); // Закрытие файла с дескриптором pF
pF= fopen("test.txt" , "r+"); // Открытие файла для чтения
char * FBuf[200]; // Описание буфера FBuf для ввода строки из файла
fgets((char *)FBuf, 100, pF); // чтений строки из файла в FBuf
printf( "Из файла строка = %s \n", FBuf ); // вывод на консоль буфера FBuf
fclose(pF); //Закрытие файла с дескриптором pF
В различных примерах данных методических указаний (см. ниже) и контрольных заданий вы можете использовать данные примеры.
11 Уровни ввода/вывода и типы файлов
В языке программирования СИ предусматриваются, в зависимости от поставленной задачи, различные технологии (и функции) для работы с файлами. Можно выделить следующие возможности:
-
Посимвольный ввод вывод в файлах, когда текстовый файл рассматривается как одна длинная строка;
-
Ввод/вывод среднего уровня (строки), в этом случае текстовый файл рассматривается как совокупность строк;
-
Ввод/вывод верхнего уровня, текстовые файлы формируются на основе шаблонов форматированного вывода (Потоки, форматирование и буферизация);
-
Ввод/вывод нижнего уровня, в этом случае используются бинарные файлы, а представление информации задается во внутреннем представлении компьютера (работа с байтами, структурами с внутренним представлением).
-
Ввод/вывод с консоли (прямой мониторный вывод и прямой ввод с клавиатуры), а также для портов ввода и вывода (другие устройства ввода и вывода – принтер, динамик и т.д.).
12 Описание файла в программе. Структура FILE.
Для работы с файлом его дескриптор нужно описать. Выше было отмечено, что значение дескриптора формируется при открытии файла. Возможны два варианта запоминания дескриптора в зависимости от технологии работы с файлом (ввод/вывод на нижнем уровне и ввод/вывод на верхнем уровне). Для работы на верхнем уровне можем записать так:
FILE *pF; // Описание указателя pF – с дескриптором файла _file
pF= fopen("test.txt" , "w+"); // открытие файла для записи и создания
Указатель pF, если файл открыт без ошибок, может использоваться до тех пор пока файл не был закрыт. На верхнем уровне это делается так:
fclose(pF); //Закрытие файла с дескриптором pF
Структура FILE для работы с файлами в этом режиме показана ниже. Как видно из описания это имя объявлено описателем typedef.
struct _iobuf {
char *_ptr;
int _cnt;
char *_base;
int _flag;
int _file; // Дексриптор открытого файла
int _charbuf;
int _bufsiz;
char *_tmpfname;
};
typedef struct _iobuf FILE; // Задание типа структуры FILE
Описание дескриптора на нижнем уровне выполняется так, здесь нет никакой структуры, вся информация о файле сохраняется на уровне операционной системы:
// Низкоуровневый - двоичный ввод - вывод
int pFBin = 0;
А закрытие файла выполняется следующим вызовом:
_close( pFBin ); // Низкоуровневое закрытие файла
13 Текстовые и бинарные (двоичные) файлы
Мы уже не один раз упоминали текстовые и бинарные файлы, но не уточнили, в чем заключается различие между ними. Во-первых, текстовые файлы могут быть использованы и в текстовом режиме. Главное различие текстовых и бинарных файлов заключается в способе представления цифровых данных. Символьные данные в этих двух случаях представляются одинаково. В текстовых файлах цифровые данные представляются символами, т.е. выполняется перевод в символьное представление (fprintf, itoa и др.). В бинарных файлах цифровое представление данных из оперативной памяти копируется в файл во внутреннем представлении, т.е. копируются байты, а не символьное представление данных. Различие между способами представления информации можно увидеть на совместной распечатке шестнадцатеричного и символьного представления данных. Для текстового файла такая распечатка выглядит так (целые числа представлены символьно – “31” и “32”):
Адр.: Шестнадцатеричное представление |Символьное предст.
0000: D1 F2 F0 EE EA E0 31 20| 21 21 21 20 31 20 32 20|Строка1 !!! 1 2















