Файловая структура ОС. Операции с файлами


Лабораторная работа №10

ВЫВОД НА ДИСК И ПРИНТЕР

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

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

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

Что такое файловая структура

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

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

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

Рис. 1. Некоторое время данные хранятся в буфере

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

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


Рис. 2. Файловая структура хранит информацию, необходимую для нормального выполнения файловых операций

Почти все компиляторы Си и Си++ хранят информацию, необходимую для работы с файлами, в файле заголовков STDIO.H. Этот файл содержит определения констант, которые нужны для операций с файлами. Кроме того, он может содержать описание файловой структуры. Для того, чтобы воспользоваться функциями работы с файлами, программу следует начинать с инструкции

#include,

которая сделает файловые константы и описание файловой структуры доступными в процессе компиляции и компоновки программы.

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

Указатель на файл

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

FILE *file_pointer;

Имя структуры FILE говорит программе о том, что определяемая переменная является указателем именно на файловую структуру. Звездочка предписывает создать указатель с соответствующим именем переменной.

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

FILE *infile, *outfile;

Как открыть файл

Связь между программой и файлом устанавливается при помощи функции fopen(), синтаксис которой показан на рис. 3.

Эта функция присваивает адрес структуры указателю. Первым параметром этой функции является имя файла, которое должно быть указано в соответствии с


Рис. 3. Синтаксис функции fopen()

определенными правилами. Например, в операционной системе MS-DOS имя файла может состоять максимум из восьми символов, плюс расширение имени, состоящее не более чем из трех символов (расширение не является обязательным элементом). Если вы хотите вывести информацию на печатающее устройство, а не в дисковый файл, в качестве имени файла в кавычках указывается "PRN". При этом автоматически осуществляется вывод данных на принтер.

В качестве второго параметра функции передается режим доступа к файлу, то есть сообщение о том, какие операции пользователь намерен производить с файлом. В Си и Си++ параметр, определяющий режим доступа, также заключается в кавычки. Возможны следующие варианты:

R - Указывает на то, что будет выполняться чтение информации из файла в память компьютера. Если файл к этому моменту не существует на диске, программа сообщит об ошибке выполнения.w - Указывает на то, что будет выполняться запись данных на диск или вывод на принтер. Если файл к этому моменту не существует, операционная система создаст его. Если файл уже существует на диске, вся записанная в нем на данный момент информация будет уничтожена.a - Указывает на то, что следует добавить информацию в конец файла. В случае отсутствия файла, операционная система создаст его. Если он существует, выводимые новые данные будут добавлены в конец файла без уничтожения текущего содержимого.

Например, если вы хотите создать файл с именем CD.DAT для хранения картотеки коллекции компакт-дисков, вы должны использовать следующие инструкции:

FILE *cdfile;cdfile = fopen("CD.DAT", "w");

Если в программе требуется осуществить чтение из файла, а не запись в него, используйте следующую запись:

FILE *cdfile;cdfile = fopen("CD.DAT", "r");

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

Если вы хотите распечатать информацию о вашей коллекции на принтере, используйте следующую последовательность инструкций:

FILE *cdfile;cdfile = fopen("PRN", "w");

Учтите, что вывод информации на принтер возможен только с режимом доступа "w".

Как Си/Си++ работает с файлами

Си сохраняет сведения о текущей позиции чтения и записи в файле, используя специальный указатель.

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

Если файл открывается с режимом доступа "w", указатель также помещается в начало файла, так что первые введенные данные будут помещены в начало файла. При закрытии файла после введенного массива данных будет добавлен символ конца файла. Если файл к моменту его открытия с использованием режима доступа "w" уже существует, все содержащиеся в нем данные затираются и «поверх» них записывается новая информация, введенная с помощью процедуры записи. Любые данные, которые могут остаться не уничтоженными, располагаются после нового символа конца файла, так что к ним уже нельзя будет обратиться при следующем чтении данных из файла. Таким образом, любая попытка записи данных в существующий файл с использованием режима доступа "w" приведет к уничтожению хранящейся в нем на данный момент информации. Это произойдет даже в том случае, если файл будет просто открыт и закрыт, без записи каких-либо данных.

Если файл открывается с использованием режима доступа "a", указатель помещается на символ конца файла. Новые данные, которые записываются в файл, размещаются после уже существующих данных, а затем добавляется символ конца файла.

Как закрыть файл

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

Fclose(file_pointer);

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

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

Листинг 1. Использование одного указателя файла в двух операциях.

FILE *cdfile;if((cdfile = fopen("CD.DAT", "w")) == NULL) { puts("Невозможно открыть файл"); exit(); }/* Здесь должны располагаться инструкции записи в файл */fclose(cdfile);if((cdfile = fopen("CD.DAT", "r")) == NULL) { puts("Невозможно открыть файл"); exit(); }/* В этом месте должны быть записаны инструкции чтения из файла */fclose(cdfile);

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

Некоторые компиляторы позволяют обеспечить запись всех данных в файл путем очистки буфера с помощью функции

Эта функция позволяет без закрытия файла очистить буфер и записать все имеющиеся в нем данные на диск или направить их на принтер.

Функции ввода и вывода

Существует несколько способов передачи данных в файл и получения их из файла в зависимости от используемой функции:

· посимвольная запись данных в файл или вывод их на принтер с использованием функции putc() или fputc();

· посимвольное чтение данных из файла с использованием функции getc() или fgetc();

· построчная запись данных в файл или вывод их на принтер с использованием функции fputs();

· построчное чтение данных из файла с использованием функции fgets();

· форматированный вывод символов, строк или чисел на диск или на принтер с помощью функции fprintf();

· форматированный ввод символов, строк или чисел из файла с помощью функции fscanf();

· запись целой структуры с использованием функции fwrite();

· чтение целой структуры с использованием функции fread().

Работа с символами

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

/*fputc.c*/#include main() { FILE *fp; char letter; if((fp = fopen("MYFILE","w"))==NULL) { puts("Невозможно открыть файл"); exit(); } do { letter=getchar(); fputc(letter, fp); } while(letter != "\r"); fclose(fp); }

Файл открывается с режимом доступа "w". Если файл с именем MYFILE не существует к моменту выполнения программы, он будет создан. В цикле do, с помощью функции getchar(), осуществляется ввод последовательности символов, которые затем записываются в файл с помощью функции putc(). Синтаксис записи putc() таков:

Putc(char_variable, file_pointer);

С теми же аргументами может использоваться и функция fputc().

Цикл выполняется до тех пор, пока не нажата клавиша Enter , которая вводит код «возврат каретки» (\r), после чего файл закрывается.

Работа со строками

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

Функция fputs() имеет следующий синтаксис:

Fputs(string_variable, file_pointer);

Эта функция выполняет построчную запись данных в файл или вывод на принтер, но не добавляет код «новая строка». Для того чтобы каждая строка записывалась на диск (или печаталась на принтере) действительно как отдельная строка, необходимо вводить код «новая строка» вручную. Например, в приведенной ниже программе создается файл имен:

/*fputc.c*/#include main() { FILE *fp; char flag; char name; if((fp = fopen("MYFILE","w"))==NULL) { puts("Невозможно открыть файл"); exit(); } flag = "y"; while(flag != "n") { puts("Введите имя"); gets(name); fputs(name, fp); fputs("\n",fp); printf("Желаете ввести другое имя?"); flag=getchar(); putchar("\n"); } fclose(fp); }

Выполнение цикла while продолжается до тех пор, пока в ответ на подсказку не будет введен символ n. В этом цикле осуществляется ввод имени с клавиатуры с помощью функции gets(), после чего имя записывается на диск с помощью функции fputs(). Далее в файл записывается код «новая строка», и, наконец, программа спрашивает пользователя, желает ли он продолжить ввод имен.

Если ваш компилятор может использовать функцию strlen(), можно несколько упростить процедуру ввода, используя следующие инструкции:

Printf("Пожалуйста, введите имя: ");gets(name);while(strlen(name) > 0) { fputs(name, fp); fputs("\n", fp); printf("Пожалуйста, введите имя: "); gets(name); }

Символы, которые вы набираете на клавиатуре, присваиваются строковой переменной name, а затем проверяется, не оказалась ли длина строки равной 0. Если на запрос сразу же нажать клавишу Enter, строка будет иметь нулевую длину и выполнение цикла прекратится. Если до нажатия Enter ввести хотя бы один символ, строка и код «новая строка» будут записаны на диск.

Некоторые компиляторы позволяют еще более упростить алгоритм ввода строки, например, так:

Printf("Пожалуйста, введите имя: ");while(strlen(gets(name)) > 0) { fputs(name, fp); fputs("\n", fp); printf("Пожалуйста, введите имя: "); }

где ввод строки выполняется внутри условия while.

Для того чтобы напечатать строку на принтере, вместо записи ее на диск используется имя файла "prn". Чтобы открыть файл, требуется указать:

If ((fp = fopen("prn", "w")) == NULL)

Для создания программы печати длина строки определяется равной 81 символу, чтобы строка могла уместиться во всю ширину экрана, прежде чем будет нажата клавиша Enter . В Листинге 2 приводится текст программы, которая демонстрирует, как можно написать простой текстовый процессор. Строка не посылается на принтер до тех пор, пока не нажата клавиша Enter , что позволяет с помощью клавиши Backspace корректировать ошибки ввода строки.

Листинг 2. Программа вывода строки на печатающее устройство.

/*wp.c*/#include "stdio.h"main() { FILE *fp; char line; if ((fp = fopen("prn", "w")) == NULL) { puts("Принтер не готов к работе"); exit(); } puts("Введите текст, после ввода каждой строки нажимайте Enter\n"); puts("Для прекращения ввода нажмите Enter в начале новой строки\n"); gets(line); while (strlen(line) > 0) { fputs(line, fp); fputs("\n", fp); gets(line); } fclose(fp); }

Чтение строк

Чтение строк из файла осуществляется с помощью функции fgets(). Синтаксис функции:

Fgets(string_variable, lenght, file_pointer);

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

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

/*fgets.c"/#include "stdio.h"main() { FILE *fp; char name; if ((fp = fopen("MYFILE", "r")) == NULL) { puts("Невозможно открыть файл"); exit(); } while(fgets(name, 12, fp) != NULL) { printf(name); } fclose(fp); }

Ввод выполняется внутри цикла while до тех пор, пока значение читаемого символа не равно NULL. Как только указатель достигнет конца файла, строковой переменной присваивается значение NULL. При построчном чтении из файла для указания конца файла всегда используется NULL, а EOF используют при посимвольном чтении.

Если вы пишете программу, предназначенную для чтения любого текстового файла, указывайте значение аргумента lenght равным 80.

Кстати, обратите внимание, что функция printf() используется в этом примере для вывода содержимого строковой переменной без указателей формата. Каждая строка, читаемая из файла, включает код «новая строка», который был записан в файл в инструкции fputs("\n", fp);, и никаких дополнительных кодов «новая строка» в параметры функции printf() включать не требуется.

Листинг 3. Форматированный вывод.

/*fprintf.c*/#include "stdio.h"main() { FILE *fp; char name; int quantity; float cost; if ((fp = fopen("MYFILE", "w")) == NULL) { puts("Невозможно открыть файл"); exit(); } printf("Введите наименование товара: "); gets(name); while (strlen(name) > 0) { printf("Введите цену товара: "); scanf("%f", &cost); printf("Введите количество единиц товара: "); scanf("%d", &quantity); fprintf(fp, "%s %f %d\n", name, cost, quantity); printf("Введите наименование товара: "); gets(name); } fclose(fp); }

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

Do { printf("Введите наименование товара: "); gets(name); printf("Введите цену: "); scanf("%f", &cost); printf("Введите количество единиц товара: "); scanf("%d", &quantity); fprintf(fp, "%s %f %d\n", name, cost, quantity); }while (strlen(name) > 0);

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

Внутри цикла while данные о цене и количестве каждого наименования товара вводятся с использованием функции scanf(), а затем записываются на диск с помощью инструкции

Fprintf(fp, "%s %f %d\n", name, cost, quantity);

Обратите внимание, что код «новая строка» записывается в файл в конце каждой строки. Если просмотреть содержимое файла с помощью команды TYPE операционной системы MS-DOS, то каждая строка инвентарной описи и на экране будет начинаться с новой строки:

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

Дискеты 1.120000 100лента 7.340000 150картридж 75.000000 3

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

Дискеты 1.120000 Memoryexлента 7.340000 Okaydataкартридж 75.000000 HP

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

Дискеты 1.120000 Memoryexлента

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

Листинг 4. Чтение форматированного текста из файла.

/*fscanf.c*/#include "stdio.h"main() { FILE *fp; char name; int quantity; float cost; if ((fp = fopen("MYFILE", "r")) == NULL) { puts("Невозможно открыть файл"); exit(); } while (fscanf(fp, "%s%f%d", name, &cost, &quantity) != EOF) { printf("Наименование товара: %s\n", name); printf("Цена: %.2f\n", cost); printf("Количество единиц: %d\n", quantity); } fclose(fp); }

Работа со структурами

Одним из способов преодолеть ограничения функции scanf() является объединение элементов данных в структуру с тем, чтобы впоследствии осуществлять ввод и вывод структур целиком. Структуру можно записать на диск с помощью функции fwrite() и прочитать из файла с помощью функции fread().

Синтаксис функции fwrite() такой:

Fwrite(&structure_variable, structure_size, number_of_structures, file_pointer);

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

· &structure_variable - имя структурной переменной с оператором получения адреса, сообщающим компилятору стартовый адрес информации, которую мы хотим записать на диск;

· structure_size - это количество символов в структуре; не обязательно подсчитывать его самому, для этого можно использовать библиотечную функцию sizeof(), записанную следующим образом:

Sizeof(structure_variable)

которая автоматически определит размер указанной структуры;

· number_of_structures - это целое число, определяющее количество структур, которые мы хотим записать в один прием; здесь всегда следует указывать число 1, если только вы не собираетесь создать массив структур и записать его одним большим блоком;

· file_pointer - указатель на файл.

В качестве примера предположим, что вы хотите записать на диск сведения о своей коллекции компакт-дисков. Используя структуру CD, которую мы подробно разбирали ранее, пишем инструкцию: fwrite(&disc, sizeof(disc), 1, fp);

Выполнение этой инструкции иллюстрирует рис. 5.

Текст программы, которая вводит данные в структуру CD, а затем сохраняет ее на диске, приведен в Листинге12.5. Для ввода имени создаваемого файла используется функция gets(). Переменная, в которой хранится имя файла, используется функцией fopen() для того, чтобы открыть файл.

Информация о каждой структуре CD вводится с клавиатуры, после чего структура целиком записывается на диск.



Рис. 5. Синтаксис функции fwrite() в инструкции записи структуры CD

Листинг 5. Запись структуры CD.

/*fwrite.c*/#include "stdio.h"main() { FILE *fp; struct CD { char name; char description; char category; float cost; int number; } disc; char filename; printf("Введите имя файла, который вы желаете создать: "); gets(filename); if ((fp = fopen(filename, "w")) == NULL) { printf("Невозможно открыть файл %s\n", filename); exit(); } puts("Введите сведения о диске\n"); printf("Введите название диска: "); gets(disc.name); while (strlen(disc.name) > 0) { printf("Введите описание: "); gets(disc.description); printf("Введите категорию: "); gets(disc.category); printf("Введите цену: "); scanf("%f", &disc.cost); printf("Введите номер ячейки: "); scanf("%d", &disc.number); fwrite(&disc, sizeof(disc), 1, fp); printf("Введите название: "); gets(disc.name); } fclose(fp); }

Чтение структур

Fread(&structure_variable, structure_size, number_of_structures, file_pointer);

За исключением имени функции эта инструкция полностью совпадает с записью функции fwrite(). Программа, в которой из файла считывается структура CD, приведена в Листинге 6. Для чтения данных используется цикл while:

While (fread(&disc, sizeof(disc), 1, fp) == 1)

Функция fread() возвращает значение, соответствующее количеству успешно прочитанных структур. Так как в аргументе функции мы указали, что читать следует по одной структуре, функция возвращает значение 1. Цикл while будет выполняться до тех пор, пока считывание структур с диска проходит успешно. Если чтение структуры становится невозможным, например потому, что достигнут конец файла, функция возвращает значение 0, и выполнение цикла прекращается.

Листинг 6. Чтение структуры CD с диска.

/*fread.c*/#include "stdio.h"main() { FILE *fp; struct CD { char name; char description; char category; float cost; int number; } disc; char filename; printf("Введите имя файла, который желаете открыть: "); gets(filename); if ((fp = fopen(filename, "r")) == NULL) { printf("Невозможно открыть файл %s\n", filename); exit(); } while (fread(&disc, sizeof(disc), 1, fp) == 1) { puts(disc.name); putchar("\n"); puts(disc.description); putchar("\n"); puts(disc.category); putchar("\n"); printf("%f", disc.cost); putchar("\n"); printf("%d", disc.number); } fclose(fp); }

В табл. 1 собраны все описанные способы ввода и вывода данных и показаны значения, которые возвращает каждая функция при невозможности продолжения чтения или записи данных.

Таблица 1. Функции ввода в файл и вывода из файла.

Чтение в массив

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

В Листинге 7 приведен текст программы, осуществляющей чтение информации из файла, содержащего данные о коллекции компакт-дисков, в массив структур CD (предполагается, что их количество не превышает 20). Индекс используется для того, чтобы каждая считанная из файла структура сохранялась в отдельном элементе массива disc. После того как очередная структура прочитана и выведена на экран, стоимость очередного диска добавляется к сумме, отражающей общую стоимость коллекции, а значение индекса и счетчика увеличивается за счет выполнения следующих инструкций:

Total = total + disc.cost;index++;count++;

Если бы нас интересовала только информация об общей стоимости и количестве экземпляров коллекции, можно было бы читать данные в структурную переменную, не используя массив, и просто подсчитывать значения переменных total и count. Однако если данные будут считаны в массив, вы сможете произвольным образом обращаться к структурам и печатать любую информацию.

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

Листинг 7. Чтение структуры в массив.

/*rarray.c*/#include "stdio.h"main() { FILE *fp; struct CD { char name; char description; char category; float cost; int number; } disc; int index, count; float total; count = 0; total = 0; char filename; printf("Введите имя файла данных: "); gets(filename); while ((fp = fopen(filename, "r")) == NULL) { printf("Невозможно открыть файл %s\n", filename); printf("Введите имя файла данных: "); gets(filename); } index = 0; while (fread(&disc, sizeof(disc), 1, fp) == 1) { puts(disc.name); putchar("\n"); puts(disc.description); putchar("\n"); puts(disc.category); putchar("\n"); printf("%f", disc.cost); putchar("\n"); printf("%d", disc.number); total = total + disc.cost; index++; count++; } fclose(fp); printf("Общая стоимость коллекции составляет %.2f\n", total); printf("Коллекция содержит %.d дисков\n", count); }

Листинг 8. Программа копирования содержимого файлов.

/*filecopy.c*/#include "stdio.h"main() { FILE *fp1, *fp2; char infile, outfile; int letter; printf("Введите имя файла для чтения: "); gets(infile); if ((fp1 = fopen(infile, "r")) == NULL) { printf("Невозможно открыть файл %s", infile); exit(); } printf("Введите имя файла для записи: "); gets(outfile); if ((fp2 = fopen(infile, "w")) == NULL) { printf("Невозможно открыть файл %s", outfile); fclose(fp1); exit(); } while ((letter = fgetc(fp1)) != EOF) { putchar(letter); fputc(letter, fp2); } fclose(fp1); fclose(fp2); }

Первый файл открывается с режимом доступа "r", чтобы можно было прочитать из него данные. Если файл невозможно открыть, программа завершается. Второй файл открывается с режимом доступа "w", что позволяет записывать в


Рис. 6. Функция fprintf() записывает числовые значения в виде текстовых символов

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

Функция fprintf() записывает все данные в виде текста. Например, если использовать fprintf() для записи числа 34.23 на диск, пять символов будут записаны так, как это показано на рис. 6. Если в дальнейшем для чтения данных из файла используется функция fscanf(), символы будут преобразованы в числовое значение и в таком виде записаны в переменную.

Вследствие того, что функция fprintf() записывает данные в виде текста, чтение из файла можно осуществлять и с помощью функций getc(), fgetc() или fgets(). Однако эти функции будут читать информацию в виде «печатных» символов. Например, если использовать функцию fgets(), числа будут считываться в виде символов, являющихся частью строки. При отображении на экране или печати на принтере данных, прочитанных с использованием функции fgets() или fgetc(), вы будете лишены возможности выполнения арифметических операций над отдельными элементами данных.

Двоичный формат

Для сохранения числовых переменных в двоичном формате используется функция fwrite(). Записанные таким образом данные на диске займут столько же места, сколько и в памяти. Если просмотреть содержимое такого файла с помощью команды TYPE, мы увидим на месте числовых значений бессмысленные буквы и значки. Это ASCII-символы, эквивалентные записанным в файл значениям.

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

Печать данных

С технической точки зрения вывести данные на принтер можно с помощью любой функции вывода: посимвольно, построчно, форматированными строками или структурами. Единственное, что необходимо, - это указать имя файла "prn" и режим доступа "w".

Однако «поструктурная» печать с помощью функции fwrite() практически не используется, так как числовые данные при этом будут напечатаны в двоичном формате в виде загадочных символов. Вместо этого для печати структур используется функция fprintf(), как это показано в Листинге 9. В этой программе открываются два файла: дисковый файл открывается для чтения, а файл принтера - для вывода.

Листинг 9. Чтение и печать содержимого дискового файла.

Каждая структура целиком вводится функцией fread(), после чего отдельные члены структуры печатаются с использованием функции fprintf(). Функция fread() может читать строки, включающие пробелы, поэтому ее применение предпочтительнее, чем использование функции fscanf().

Инструкции

Fprintf(ptr, "\n\n");

выводят по две пустые строки между отдельными структурами CD.

Проектирование программы

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

Например, вам может понадобиться просмотреть дисковый файл в поисках определенной записи. В этом случае следует открыть файл с режимом доступа "r", а потом использовать цикл для постепенного ввода данных, структура за структурой или строка за строкой в зависимости от того, к какому типу относится информация, записанная в файл. Во время каждого прохождения цикла значения вводимых данных сравниваются с искомыми. Для проверки значений строк используйте функцию strcmp(), конечно, если ваш компилятор это позволяет. Как только искомые данные найдены, они выводятся на экран, после чего файл закрывается.

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

и файловой структуры

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

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

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

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

Открытие файла по умолчанию в любой операционной системе производится двойным кликом мыши. Однако не факт, что все можно открыть таким способом. Простейший пример: исполняемые файлы в Windows, имеющие расширение.exe, так запустить можно, а вот те же динамические библиотеки, в расширении обозначаемые как.dll, хоть и содержат исполняемые коды, тем не менее, таким способом не открываются. Связано это только с тем, что обращение к их содержимому производится посредством других программных компонентов, или вызов кода осуществляется специализированными компонентами самой операционной системы. Но это самый простой пример.

Файлы (объекты), не соответствующие ни ни какой-либо программе, открыть будет не так просто. Грубо говоря, ни одна «операционка» не поймет, какое именно средство для открытия нужно запустить. В лучшем случае будет предложено выбрать соответствующую программу самому из предоставляемого списка вероятных решений.

Файлы и файловая структура: информатика на заре развития компьютерных технологий

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

С появлением уникального детища Norton Commander такая необходимость не то чтобы отпала (некоторые команды все равно прописывать было нужно), а, скорее, уменьшилась. Именно этот файловый менеджер, исходя из нашего примера, и можно назвать оглавлением, поскольку все данные, хранящиеся на жестком диске или внешнем носителе, были четко структурированы.

Файлы и папки

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

В принципе, не говоря о книжных страницах, наиболее четко понятие папки можно выразить, если посмотреть на какой-нибудь комод с множеством ящиков, в которых что-то лежит. Вот это «что-то» и есть файлы, а ящики - директории.

Простейшие примеры поиска файлов

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

Однако для более точного поиска иногда нужно знать, где именно располагается искомый файл. Грубо говоря, необходимо выбрать определенный ящик в комоде, где находится нужный нам предмет. Сам поиск производится при помощи стандартного средства в файловом менеджере, но можно использовать и сочетание вроде Ctrl + F, которое вызывает поисковую строку.

Что такое файловая система?

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

Сегодня файловых систем можно найти достаточно много. К примеру, наиболее известными для Windows с момента развития компьютерной техники стали системы FAT с архитектурой 8, 16, 32 и 64 бита, NTFS и ReFS. Файловая система, структура файла, способ упорядочивания тесно связаны между собой. Но теперь несколько слов о самих системах.

Не говоря о технических подробностях, следует отметить, что основное различие между ними состоит только в том, что FAT имеет больший для хранения и ускоренного доступа к файлам небольшого объема, а NTFS и ReFS оптимизированы для больших массивов данных и быстрого доступа к ним на максимальной скорости считывания информации с жесткого диска.

Операции с файлами

Теперь посмотрим с другой стороны на то, что представляет собой Операции с файлами, которые предусмотрены в любой «операционке», в общем-то, особо и не различаются.

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

Архивация данных

Среди специфичных функций в первую очередь можно выделить сжатие файлов и папок, называемое архивацией, а также обратный процесс - извлечение данных из архива. На момент разработки системы DOS создание архивных типов данных в основном сводилось к использованию стандарта ARJ.

Но с появлением технологий ZIP-архивирования такие процессы получили новое развитие. Впоследствии был создан и универсальный архиватор RAR. Эти технологии сейчас представлены в любой «операционке» даже без необходимости устанавливать дополнительное ПО. Файловая структура ОС операции с файлами в этом ракурсе трактуется как виртуальносжатие. По сути, технологии сжатия просто дают системе указание на то, чтобы она определяла не искомый размер, а меньший. Сам информационный объем файла или папки при архивации не меняется.

Управление отображением объектов

Понятия «файловая структура», «структура файла» и т. д. следует рассматривать еще и с точки зрения возможности видения самих объектов. Не секрет, что практически все пользователи современных ПК сталкивались с термином «скрытые файлы и папки».

Что это такое? Означает это только то, что в системе установлено ограничение на отображение некоторых объектов (например, системных файлов и папок, чтобы пользователь их случайно не удалил). То есть в физическом плане они с жесткого диска никуда не деваются, просто файловый менеджер их не видит.

Чтобы отобразить все скрытые объекты, в том же «Проводнике» следует использовать меню «Вид», где на соответствующей вкладке ставится галочка в строке отображения всех и файлов. После включения такого вида объекты будут иметь полупрозрачные иконки.

С поиском скрытых объектов тоже могут возникнуть трудности. При вводе имени файла или его расширения даже с указанием конкретного местоположения при отключенном отображении таких объектов результата не будет (система ведь не видит их). Для того чтобы их найти, нужно в начале и в конце имени корневой папки вводить символ %. Например, для поиска директории AppData, которая является скрытой и располагается в локальной папке настроек конкретного пользователя, следует использовать строку поиска %USERPROFILE%\AppData. Только в этом случае файл и файловая структура в целом получат ключ к взаимосвязи.

Заключение

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

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

Все программы и данные хранятся в долговременной памяти компьютера в виде файлов .

Определение 1

Файл – поименованная совокупность данных, записанных на носитель. Любой файл имеет имя, состоящее из двух частей, отделяемых точкой, - собственно имени и расширения. При задании имени файла желательно, чтобы оно указывало или на содержимое файла, или на автора.

Расширение указывает на вид информации, хранящийся в файле. Имя файлу дает пользователь, а тип файла обычно задается программой автоматически при его создании.

Рисунок 1.

Имя файла может содержать до $255$ символов, включая расширение. Имя файла может состоять из английских и русских букв, цифр и др. символов.

В именах файлов запрещено использовать знаки:

\ / * ? : “ | .

Расширение некоторых типов файлов:

Рисунок 2.

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

Рисунок 3.

Классификация значков файлов

Рисунок 4.

Определение 2

Файловая структура – совокупность файлов и взаимосвязь между ними.

Одноуровневая файловая структура используется для дисков с небольшим количеством файлов и представляет собой линейную последовательность имен файлов.

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

Каждый диск имеет логическое имя, обозначаемое латинской буквой со знаком двоеточия:

  • C:, D:, E: и т.д. – жесткие и оптические диски,
  • А:, В: - гибкие диски.

Папкой верхнего уровня для диска является корневая папка, которая в OS Windows обозначается добавлением к имени диска значка «\», например, D:\ - обозначение корневой папки.

Пример файловой структуры :

Рисунок 5.

Каталог - это папка или директория, куда помещают файлы и другие каталоги.

Каталог, который не является подкаталогом ни одного другого каталога , называется корневым . Такой каталог находится на самом верхнем уровне иерархии всех каталогов. В Windows каждый из дисков имеет свой корневой каталог (D:\, C:\, E:).

Каталоги в OS Windows делятся на системные и пользовательские. Пример системных каталогов: «Рабочий стол», «Сетевое окружение», «Корзина», «Панель управления».

Рисунок 6. Системные каталоги OS Windows

Слева направо: системная папка

Корзина, папка Мои документы, ярлык к папке Мои документы

Каталог и папка физически одно и тоже.

Путь к файлу – это его адрес.

Путь к файлу всегда начинается с указанием логического имени диска (D:\, C:\, E:), затем записывается последовательность имен вложенных друг в друга папок, в последней папке содержится нужный файл. Путь к файлу вместе с именем файла называют полным именем файла, например: D:\Мои документы\Литература\Сочинение.doc полное имя файла Сочинение.doc.

Рисунок 7. Дерево каталогов и файлов

Схематично файловую структуру диска представляют в виде дерева.

Рисунок 8. Файловая структура диска Z:

  • Z:\box\box1 – полное имя папки (каталога) box1
  • Z:\box\box.txt – полное имя файла box.txt
  • Z:\box\box2\box3\box1 - полное имя папки (каталога) box1
  • Z:\box\box2\box3\box.txt - полное имя файла box.txt

Л 5.1. АРХИТЕКТУРА ПОСТРОЕНИЯ ОС

Ключевые слова: файл, расширение имени файла, атрибуты файла, файловая структура, каталог (папка), путь к файлу, форматирование, сектор, дорожка, цилиндр, таблица размещения файлов (FAT-таблица), кластер, файловая система, FAT 16, FAT 32, NTFS, MTF, CDFS, команды ОС, рабочий стол, панель задач, значок и ярлык объекта, главное меню Windows , окно Windows , строка заголовка, панель инструментов, drag-and-drop, drag, «Проводник », буфер обмена, «Norton Commander », шаблоны выделения и поиска файлов.

Операционная система представляет собой комплекс системных и служебных программных средств. С одной стороны, она опирается на базовое программное обеспечение компьютера, входящее в его систему BIOS (базовая система ввода-вывода); с другой стороны, она сама является опорой для программного обеспечения более высоких уровней - прикладных и большинства служебных приложений. Приложениями операционной системы принято называть программы, предназначенные для работы под управлением данной системы.

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

· интерфейса между пользователем и программно-аппаратными средствами компьютера (интерфейс пользователя);

· интерфейса между программным и аппаратным обеспечением (аппаратно-программный интерфейс);

· интерфейса между разными видами программного обеспечения (программный интерфейс).

Даже для одной аппаратной платформы, например такой, как
IBM PC, существует несколько операционных систем (ОС). Для примера, рассмотрим файловую структуру, основные объекты и приемы управления наиболее распространенных ОС: MS DOS и Windows XP.

Файловая структура персонального компьютера. При хранении данных решаются две проблемы: как сохранить данные в наиболее компактном виде и как обеспечить к ним удобный и быстрый доступ (если доступ не обеспечен, то это не хранение). Для обеспечения доступа необходимо, чтобы данные имели упорядоченную структуру. При этом образуются адресные данные. Без них нельзя получить доступ к нужным элементам данных, входящих в структуру.

В качестве единицы хранения данных принят объект переменной длины, называемый файлом.

Файл - это именованная последовательность байтов произвольной длины . Поскольку файл может иметь нулевую длину, то создание файла заключается в присвоении ему имени и регистрации его в файловой системе - это одна из функций ОС.

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

Поскольку в определении файла нет ограничений на размер, можно представить себе файл, имеющий 0 байтов (пустой файл) , и файл, имеющий любое число байтов.



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

По способам именования файлов различают «короткое » (на имя файла отводится 8 символов, а на его расширение - 3 символа) и «длинное » имя (до 256 символов). Имя файла от его расширения разделяются точкой. Расширение файла является необязательным параметром и может отсутствовать.

В ОС MS DOS имя (не более 8 символов) и расширение (не более 3 символов) могут состоять из прописных и строчных латинских букв, цифр и символов:

- _ $ # & @ ! % () { } " ~ ^

Следует помнить, что для ОС линии MS DOS :

Между именем и расширением ставится точка, не входящая ни в имя, ни в расширение;

Имя файла можно набирать в любом регистре, т.к. для системы все буквы строчные;

Символы, не использующиеся в имени файла

* = + \ ; : , . < > / ?

Имена устройств не могут использоваться в качестве имен файлов:

AUX - имя дополнительного устройства ввода-вывода;

CON - имя клавиатуры при вводе или дисплея при выводе;

LPT1 … LPT3 - имена параллельных портов;

COM1 … COM3 - имена последовательных портов;

PRN - имя печатающего устройства;

NUL - имя фиктивного устройства, эмулирующего выводные операции без реального вывода.

С появлением ОС Windows 95 введено понятие «длинного » имени. Такое имя может содержать до 256 символов, что достаточно для создания содержательных имен файлов. «Длинное » имя может содержать любые символы, кроме девяти специальных:

\ / : * ? " < > |

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

Наряду с «длинным » именем ОС Windows 95/98/Me/2000/XP создают также и короткое имя файла - оно необходимо для возможности работы с данным файлом на рабочих местах с устаревшими операционными системами.

Использование «длинных » имен файлов в последних ОС Windows имеет ряд особенностей .

1. Если «длинное » имя файла включает пробелы, то в служебных операциях его надо заключать в кавычки. Рекомендуется не использовать пробелы, а заменять их символами подчеркивания.

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

3. Кроме ограничения на длину имени файла (256 символов) существует гораздо более жесткое ограничение на длину полного имени файла (в него входит путь доступа к файлу, начиная от вершины иерархической структуры). Полное имя не может быть длиннее 260 символов.

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

5. Прописные и строчные буквы не различаются ОС. Имена Письмо.txt и письмо. txt соответствуют одному и тому же файлу.

6. Программисты давно научились использовать расширение имени файла для передачи ОС, исполняющей программе или пользователю сведений о том, к какому типу относятся данные, содержащиеся в файле, и о формате, в котором они записаны. Приложения систем предлагают выбрать только основную часть имени и указать тип файла, а соответствующее расширение имени приписывают автоматически.

В зависимости от расширения все файлы делятся на две большие группы: исполняемые и неисполняемые.

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

· ехе - готовый к исполнению файл (winrar.exe ; winword.exe );

· сот - файл операционной системы (command.com );

· sys - файл операционной системы (io.sys ) - обычно это драйвер внешнего устройства;

· bat - командный файл операционной системы MS DOS (autoexec.bat ).

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

ASM - текст программы на языке ассемблер ;

AVI, MPEG, MPG, WMV и т.д. - различные форматы видеофайлов, для просмотра можно воспользоваться, например, Windows Media Player - тип данных: изображение;

BAK - старая версия файла;

BAS - текст программы на языке Бейсик ;

BMP - документ, созданный в графическом редакторе, например, Paint - тип данных: изображение;

C - текст программы на языке Си ;

CDR CorelDraw - тип данных: изображение;

CPP - текст программы на языке C ++;

dbf - файл базы данных, созданный, например, в СУБД FoxPro ;

DOC - документ, созданный в текстовом процессоре Microsoft Word - тип данных: текст;

DWG, DXF - графические файлы, созданные в AutoCAD ;

HTML - документ, рассчитанный на публикацию в Интернете;

LIB - библиотека (обычно объектных модулей);

MDB - файл базы данных, созданный в СУБД Microsoft Access ;

MP3, MID, WMA, WAV – различные форматы звуковых файлов - тип данных: звук;

OBJ - объектный модуль;

PAS - текст программы на языке Паскаль ;

PDF - PDF -документ, созданный и предназначенный для просмотра в программе Adobe Reader ;

PPT - файл презентации, созданной в Microsoft PowerPoint ;

PSD - графический файл, созданный в графическом процессоре Adobe Photoshop ;

RAR WinRar ;

RTF - документ, созданный в текстовом редакторе WordPad ;

TIF, GIF, JPG - различные форматы графических файлов;

TMP - временный файл;

TXT - текстовый файл, например, созданный в программе Блокнот ;

XLS - электронная книга, созданная в табличном процессоре Microsoft Excel - тип данных: символы (текст или числа);

ZIP - архивный файл, созданный программой архиватором WinZip .

Кроме имени и расширения имени файла операционная система хранит для каждой файла дату его создания (изменения) и несколько флаговых величин, называемых атрибутами файла. Атрибуты - это дополнительные параметры, определяющие свойства файлов . Операционная система позволяет их контролировать и изменять. Состояние атрибутов учитывается при проведении автоматических операций с файлами.

Основных атрибутов четыре:

· Только для чтения (Read only);

· Скрытый (Hidden);

· Системный (System);

· Архивный (Archive).

Атрибут «Только для чтения» ограничивает возможности работы с файлом. Его установка означает, что файл не предназначен для внесения изменений.

Атрибут «Скрытый» сигнализирует операционной системе о том, что данный файл не следует отображать на экране при проведении файловых операций. Это мера защиты против случайного (умышленного или неумышленного) повреждения файла.

Атрибутом «Системный» помечаются файлы, обладающие важными функциями для работы самой операционной системы. Его отличительная особенность в том, что средствами операционной системы его изменить нельзя. Как правило, большинство файлов, имеющих установленный атрибут «Системный» , имеют также и установленный атрибут «Скрытый» .

Атрибут «Архивный» в прошлом использовался для работы программ резервного копирования. Предполагалось, что любая программа, изменяющая файл, должна автоматически устанавливать этот атрибут, а средство резервного копирования должно его сбрасывать. Таким образом, очередному резервному копированию подлежали только те файлы, у которых этот атрибут был установлен. Современные программы резервного копирования используют другие средства для установления факта изменения файла, и данный атрибут во внимание не принимается, а его изменение вручную средствами операционной системы не имеет практического значения.

Хранение файлов организуется в иерархической структуре, которая в данном случае называется файловой структурой (рис. 1).

Рис. 1. Иерархическая структура диска

Файловая структура - иерархическая структура, в виде которой операционная система отображает файлы и каталоги (папки).

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

Имена внешних носителей информации. Диски, на которых хранится информация в компьютере, имеют свои имена - каждый диск назван буквой латинского алфавита, а затем ставится двоеточие. Так, для дискет всегда отводятся буквы А: и В: . Логические диски винчестера именуются, начиная с буквы С: . После всех имен логических дисков следуют имена дисководов для компакт-дисков. Например, установлены: дисковод для дискет, винчестер, разбитый на 3 логических диска и дисковод для компакт-дисков. Определить буквы всех носителей информации. А: - дисковод для дискет; С: , D: , Е: - логические диски винчестера; F: - дисковод для компакт-дисков.

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

Правила присвоения имени каталогу ничем не отличаются от правил присвоения имени файлу, хотя для каталогов не принято задавать расширения имен. При записи пути доступа к файлу, проходящего через систему вложенных каталогов, все промежуточные каталоги разделяются между собой определенным символом. Во многих ОС в качестве такого символа используется «\» (обратная косая черта).

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

Когда используется файл не из текущего каталога, программе, осуществляющей доступ к файлу, необходимо указать, где именно этот файл находится. Это делается с помощью указания пути к файлу.

Путь к файлу - это имя носителя (диска) и последовательность имен каталогов, в ОС Windows разделенных символом «\» (в ОС линии UNIX используется символ «/»). Этот путь задает маршрут к тому каталогу, в котором находится нужный файл.

Для указания пути к файлу используют два различных метода. В первом случае каждому файлу дается абсолютное имя пути (полное имя файла), состоящее из имен всех каталогов от корневого до того, в котором содержится файл, и имени самого файла. Например, путь С:\Abby\Doc\otchet.doc означает, что корневой каталог диска С: содержит каталог Abby , который, в свою очередь, содержит подкаталог Doc , где находится файл otchet.doc . Абсолютные имена путей всегда начинаются от имени носителя и корневого каталога и являются уникальными. Применяется и относительное имя пути. Оно используется вместе с понятием текущего каталога. Пользователь может назначить один из каталогов текущим рабочим каталогом. В этом случае все имена путей, не начинающиеся с символа разделителя, считаются относительными и отсчитываются относительно текущего каталога. Например, если текущим каталогом является С:\Abby , тогда к файлу с абсолютным путем С:\Abby\ можно обратиться как Doc\otchet.doc .

Файловые системы . Каждый файл на диске имеет свой адрес. Чтобы понять принцип доступа к информации, хранящейся в файле, необходимо знать способ записи данных на носители информации.

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

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

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

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

Обычный объем сектора - 512 байт. На одной стороне размещается 80 дорожек. Каждая дорожка содержит 18 секторов.

Под цилиндром понимается совокупность всех дорожек, принадлежащих разным поверхностям и находящихся на равном удалении от оси вращения . Физическая структура хранения данных представлена на рисунке 2.

Рис. 2. Физическая структура хранения информации

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

Наименьшей физической единицей хранения информации является сектор. Поскольку размер FAT- таблицы ограничен, то для дисков, размер которых превышает 32 Мбайта, обеспечить адресацию к каждому отдельному сектору не представляется возможным. В связи с этим группы секторов условно объединяются в кластеры. Кластер является наименьшей единицей адресации к информации. Размер кластера, в отличие от размера сектора, не фиксирован и зависит от емкости диска.

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

Файловая система - это набор соглашений, определяющих организацию данных на носителях информации . Наличие этих соглашений позволяет операционной системе, другим программам и пользователям работать с файлами и каталогами, а не просто с участками (секторами) дисков. Файловая система определяет:

· как хранятся файлы и каталоги на диске;

· какие хранятся сведения о файлах и каталогах;

· как можно узнать, какие участки диска свободны, а какие - нет;

· формат каталогов и другой служебной информации на диске.

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

Файловая система, наиболее распространенная на IBM PC -совместимых компьютерах, была введена еще в начале 80-х годов в операционных системах MS DOS 1.0 и 2.0. Эта файловая система достаточно примитивна, так как она была создана для хранения данных на дискетах. Обычно эта файловая система называется FAT , так как самой важной структурой данных в ней является таблица размещения файлов на диске, по-английски - file allocation table, сокращенно - FAT . Эта таблица содержит информацию о том, какие участки (кластеры) диска свободны, и о цепочках кластеров, образующих файлы и каталоги.

В файловой системе FAT имена файлов и каталогов должны состоять не более чем из 8 символов плюс три символа в расширении имени. Она приводит к значительным потерям (до 20%) дискового пространства из-за больших размеров кластеров на дисках высокой емкости. Это связано с тем, что в конце последнего кластера файла остается свободное место, в среднем равное половине кластера. А на больших дисках размер кластеров FAT может достигать 32 Кбайт. Таким образом, на диске емкостью
2 Гбайта с 20000 файлов потери составят 320 Мбайт, то есть около 16%. Наконец, файловая система FAT малопроизводительна, особенно для больших дисков, не приспособлена к многозадачной работе (все операции требуют обращений к таблице размещения файлов, а потому до завершения одной операции нельзя начинать другую).

При разработке Windows 95 фирма Microsoft решила не вводить новую файловую систему, а залатать имеющуюся файловую систему FAT , позволив присваивать файлам и каталогам длинные имена. Эта файловая система стала называться FAT 32 . Принятый в Windows 95 подход хорош тем, что позволяет использовать старые диски с файловой системой FAT - на них просто начинают записываться длинные имена. Но все же это решение весьма искусственное, и многие программы - для починки файловой системы дисков, «сжатия» дисков, резервного копирования и т.д. - могут привести к потере длинных имен на диске. FAT 32 поддерживает меньшие размеры кластеров, что позволяет более эффективно использовать дисковое пространство.

При разработке операционной системы Windows NT была создана новая файловая система - NTFS . Она была ориентирована на диски большого объема, содержащие множество файлов, в них приняты существенные меры по обеспечению эффективности хранения данных и контроля доступа к ним. Эта файловая система поддерживает длинные имена файлов. На логических дисках емкостью 1-2 Гбайта файловая система NTFS позволяет хранить в среднем на 10-15% больше информации, чем FAT . А доступ к файлам в ней осуществляется заметно быстрее, особенно в многозадачной среде.

При формировании файловой системы NTFS программа форматирования создает файл Master File Table (MTF ) и другие области для хранения метаданных. Метаданные используются NTFS для реализации файловой структуры. Первые 16 записей в MTF зарезервированы самой NTFS . Местоположение файлов метаданных записано в загрузочном секторе диска. Если первая запись в MTF повреждена, NTFS считывает вторую запись для нахождения копии первой. Полная копия загрузочного сектора располагается в конце тома. В MTF хранятся метаданные, такие как копия первых четырех записей (гарантирует доступ к MTF в случае, если первый сектор поврежден). MTF содержит информацию о томе - метку и номер версии. В MTF находится таблица имен атрибутов и описания, корневой каталог и др. Остальные строки MTF содержат записи для каждого файла и каталога, расположенных на данном томе. Разработчики NTFS , не забывая об эффективности, старались также обеспечить надежность файловой системы и восстанавливаемость данных при сбоях. Для этого, в частности, NTFS дублирует всю критически важную информацию и обеспечивает регистрацию всех изменений на дисках в специальном файле регистрации, причем для каждого изменения запоминается и способ его отмены. В результате практически при любых сбоях NTFS автоматически восстанавливается. NTFS также (в отличие от FAT ) может работать с логическими дисками и файлами размером более 2 Гбайт - максимальный размер логических дисков и файлов - 4х10 18 байт.

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

Особая файловая система разработана для компакт-дисков (CD-ROM ). Это оказалось необходимым, так как само физическое устройство компакт-дисков не такое, как у жестких дисков или дискет: в них информация записывается не в кольцевых дорожках, а в единственной спиралеобразной дорожке (как у аудиокомпакт-дисков). Эта файловая система называется CDFS .

Таблица 1

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

NTFS FAT 32 FAT
Поддерживаемые операционные системы Windows NT с 4 пакетом обновлений, Windows 2000, Windows XP MS-DOS, Windows 95 OSR2, Windows 98, Windows Millennium Edition, Windows NT, Windows 2000, Windows XP
Возможные размеры логических дисков Рекомендуемый минимальный размер логического диска (тома) равен примерно 10 МБ. Допускаются размеры томов свыше 2 ТБ. Не может использоваться для гибких дисков Логический диск (том) объемом от 512 МБ до 2 ТБ. Может использоваться для гибких дисков Логический диск (том) объемом до 4 ГБ. Может использоваться для гибких дисков
Возможные размеры хранимых файлов Максимальный размер файла ограничен только размером тома Максимальный размер файла равен 4 ГБ Максимальный размер файла равен 2 ГБ






2024 © gtavrl.ru.