Лекции, страница 8
Описание файла
PDF-файл из архива "Лекции", который расположен в категории "". Всё это находится в предмете "основы конструкторско-технологической информатики (окти)" из 2 семестр, которые можно найти в файловом архиве МГТУ им. Н.Э.Баумана. Не смотря на прямую связь этого архива с МГТУ им. Н.Э.Баумана, его также можно найти и в других разделах. .
Просмотр PDF-файла онлайн
Текст 8 страницы из PDF
Таким образом, внутреннее представление текста всегдасоответствует системе Unix, а внешнее - реально используемой операционной системе.Отметим также, что создатели операционной системы компьютеров Apple Macintoshвыбрали, чтобы жизнь не казалась скучной, третий, отличный от двух предыдущих,вариант: текстовые строки разделяются одним символом "\r".Такое представление текстовых файлов восходит к тем уже далеким временам,когда еще не было компьютерных мониторов и для просмотра текста использовалисьэлектрифицированные пишущие машинки или посимвольные принтеры. Текстовый файлфактически представлял собой программу печати на пишущей машинке и, таким образом,содержал команды возврата каретки и продергивания бумаги в конце каждой строки.Функция бинарной записи в файл fwrite аналогична функции чтения fread.
Онаимеет следующий прототип:size_t fwrite(char *buffer,size_t elemSize,size_t numElems,FILE *f);////////Массив записываемых данныхРазмер одного элементаЧисло записываемых элементовУказатель на структуру FILEФункция возвращает число реально записанных элементов, которое может быть меньше,чем numElems, если при записи произошла ошибка - например, не хватило свободногопространства на диске.
Пример использования функции fwrite:FILE *f;double buff[100];size_t num;. . .f = fopen("tmp.res", "wb"); // Открываем файл "tmp.res"if (f == 0) { // При ошибке открытия файла// Напечатать сообщение об ошибкеperror("Не могу открыть файл для записи");exit(1); // завершить работу программы с кодом 1}// Записываем 100 вещественных чисел в файлres = fwrite(buff, sizeof(double), 100, f);// В случае успеха res == 100Закрытие файла: функция fcloseПо окончании работы с файлом его надо обязательно закрыть.
Система обычнозапрещает полный доступ к файлу до тех пор, пока он не закрыт. (Например, внормальном режиме система запрещает одновременную запись в файл для двух разныхпрограмм.) Кроме того, информация реально записывается полностью в файл лишь вмомент его закрытия. До этого она может содержаться в оперативной памяти (в такназываемой файловой кеш-памяти), что при выполнении многочисленных операцийзаписи и чтения значительно ускоряет работу программы.Для закрытия файла используется функция fclose с прототипомint fclose(FILE *f);В случае успеха функция fclose возвращает ноль, при ошибке -- отрицательноезначение (точнее, константу конец файла EOF, определенную в системных заголовочныхфайлах как минус единица). При ошибке можно воспользоваться функцией perror, чтобы26напечатать причину ошибки.
Отметим, что ошибка при закрытии файла - явление оченьредкое (чего не скажешь в отношении открытия файла), так что анализировать значение,возвращаемое функцией fclose, в общем-то, не обязательно. Пример использованияфункции fclose:FILE *f;f = fopen("tmp.res", "wb"); // Открываем файл "tmp.res"if (f == 0) { // При ошибке открытия файла// Напечатать сообщение об ошибкеperror("Не могу открыть файл для записи");exit(1); // завершить работу программы с кодом 1}. . .// Закрываем файлif (fclose(f) < 0) {// Напечатать сообщение об ошибкеperror("Ошибка при закрытии файла");}Пример: подсчет числа символов и строк в текстовом файле.
В качествесодержательного примера использования рассмотренных выше функций файлового вводаприведем программу, которая подсчитывает число символов и строк в текстовом файле.Программа сначала вводит имя файла с клавиатуры. Для этого используется функцияscanf ввода по формату из входного потока, для ввода строки применяется формат "%s.Затем файл открывается на чтение как бинарный (это означает, что при чтении не будетпроисходить никакого преобразования разделителей строк).
Используя в цикле функциючтения fread, мы считываем содержимое файла порциями по 512 байтов, каждый разувеличивая суммарное число прочитанных символов. После чтения очередной порциисканируется массив прочитанных символов и подсчитывается число символов "\n"продергивания бумаги, которые записаны в концах строк текстовых файлов как в системеUnix, так и в MS DOS или MS Windows.
В конце закрывается файл и печатается результат.//// Файл "wc.cpp"// Подсчет числа символов и строк в текстовом файле//#include <stdio.h> // Описания функций ввода-вывода#include <stdlib.h> // Описание функции exitint main() {char fileName[256];FILE *f;char buff[512];size_t num;int numChars = 0;int numLines = 0;int i;//////////////Путь к файлуСтруктура, описывающая файлМассив для ввода символовЧисло прочитанных символовСуммарное число символов := 0Суммарное число строк := 0Переменная циклаprintf("Введите имя файла: ");scanf("%s", fileName);f = fopen(fileName, "rb"); // Открываем файл на чтениеif (f == 0) { // При ошибке открытия файла// Напечатать сообщение об ошибкеperror("Не могу открыть файл для чтения");exit(1); // закончить работу программы с кодом 1// ошибочного завершения}27while ((num = fread(buff, 1, 512, f)) > 0) { // Читаем// блок из 512 символов.
num -- число реально// прочитанных символов. Цикл продолжается, пока// num > 0numChars += num; // Увеличиваем число символов// Подсчитываем число символов перевода строкиfor (i = 0; i < num; ++i) {if (buff[i] == '\n') {++numLines; // Увеличиваем число строк}}}fclose(f);// Печатаем результатprintf("Число символов в файле = %d\n", numChars);printf("Число строк в файле = %d\n", numLines);}return 0; // Возвращаем код успешного завершенияПример выполнения программы: она применяется к собственному тексту, записанному вфайле "wc.cpp.
Введите имя файла: wc.cppЧисло символов в файле = 1635Число строк в файле = 50Форматный ввод-вывод: функции fscanf и fprintfВ отличие от функции бинарного ввода fread, которая вводит байты из файла безвсякого преобразования непосредственно в память компьютера, функция форматноговвода fscanf предназначена для ввода информации с преобразованием ее из текстовогопредставления в бинарное. Пусть информация записана в текстовом файле в привычномдля человека виде (т.е.
так, что ее можно прочитать или ввести в файл, используятекстовый редактор). Функция fscanf читает информацию из текстового файла ипреобразует ее во внутреннее представление данных в памяти компьютера. Информация околичестве читаемых элементов, их типах и особенностях представления задается спомощью формата.
В случае функции ввода формат - это строка, содержащая описанияодного или нескольких вводимых элементов. Форматы, используемые функцией fscanf,аналогичны применяемым функцией scanf, они уже неоднократно рассматривались.Каждый элемент формата начинается с символа процента "%". Наиболее частоиспользуемые при вводе форматы приведены в таблице:%d%lf%c%sцелое десятичное число типа int (d - от decimal)вещ. число типа double (lf - от long float)один символ типа charввод строки. Из входного потока выделяется слово, ограниченое пробелами или символамиперевода строки '\n'.
Слово помещается в массив символов. Конец слова отмечается нулевымбайтом.Прототип функции fscanf выглядит следующим образом:int fscanf(FILE *f, const char *format, ...);Многоточие здесь означает, что функция имеет переменное число аргументов, большеедвух, и что количество и типы аргументов, начиная с третьего, произвольны. На самомделе, фактические агрументы, начиная с третьего, должны быть указателями на вводимыепеременные. Несколько примеров использования функции fscanf:int n, m; double a; char c; char str[256];28FILE *f;.
. .fscanf(f,fscanf(f,fscanf(f,fscanf(f,"%d", &n);"%lf", &a);"%c", &c);"%s", str);// Ввод целого числа// Ввод вещественного числа// Ввод одного символа// Ввод строки (выделяется очередное// слово из входного потока)fscanf(f, "%d%d", &n, &m); // Ввод двух целых чиселФункция fscanf возвращает число успешно введенных элементов.
Таким образом,возвращаемое значение всегда меньше или равно количеству процентов внутриформатной строки.Функция fprintf используется для форматного вывода в файл. Данные при выводепреобразуются в их текстовое представление в соответствии с форматной строкой. Ееотличие от форматной строки, используемой в функции ввода fscanf, заключается в том,что она может содержать не только форматы для преобразования данных, но и обычныесимволы, которые записываются без преобразования в файл. Форматы, как и в случаефункции fscanf, начинаются с символа процента "%".
Они аналогичны форматам,используемым функцией fscanf. Небольшое отличие заключается в том, что форматыфункции fprintf позволяют также управлять представлением данных, например, указыватьколичество позиций, отводимых под запись числа, или количество цифр после десятичнойточки при выводе вещественного числа.Прототип функции fprintf выглядит следующим образом:int fprinf(FILE *f, const char *format, ...);Многоточие, как и в случае функции fscanf, означает, что функция имеет переменноечисло аргументов. Количество и типы аргументов, начиная с третьего, должнысоответствовать форматной строке.
В отличие от функции fscanf, фактические аргументы,начиная с третьего, представляют собой выводимые значения, а не указатели напеременные. Для примера рассмотрим небольшую программу, выводящую данные в файл"tmp.dat":#include <stdio.h> // Описания функций ввода вывода#include <math.h>// Описания математических функций#include <string.h> // Описания функций работы со строкамиint main() {int n = 4, m = 6; double x = 2.;char str[256] = "Print test";FILE *f = fopen("tmp.dat", "wt"); // Открыть файлif (f == 0) {// для записиperror("Не могу открыть файл для записи");return 1; // Завершить программу с кодом ошибки}fprintf(f, "n=%d, m=%d\n", m, n);fprintf(f, "x=%.4lf, sqrt(x)=%.4lf\n", x, sqrt(x));fprintf(f, "Строка \"%s\" содержит %d символов.\n",str, strlen(str));fclose(f); // Закрыть файлreturn 0;// Успешное завершение программы}В результате выполнения этой программы в файл "tmp.dat" будет записан следующийтекст:n=6, m=4x=2.0000, sqrt(x)=1.414229Строка "Print test" содержит 10 символов.В последнем примере форматная строка содержит внутри себя двойные апострофы.