Работа с файлами в языке программирования Си++
Файлы последовательного доступа, библиотечные функции fprintf, fscanf, fgets, fputs. Ввод и запись строк в файл. Создания файла и чтения из него по определенному условию. Файлы произвольного доступа. Функция fseek, обработка файла подобно массиву.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | лабораторная работа |
Язык | русский |
Дата добавления | 15.07.2010 |
Размер файла | 25,1 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Лабораторная работа №8 “Работа с файлами в языке программирования Си++”
1.Теоретические сведения
1.1 Файлы последовательного доступа
При последовательном доступе обмен информации производится через специальный буфер, резервируемый системой ввода-вывода. Компиляция языка СИ рассматривает ввод-вывод как поток файлов, которые поступают последовательно, байт за байтом. Каждый поток связывается с файлом на магнитном диске или с файлом, который поставлен в соответствии физическому устройству, например клавиатуре. Связь потока с файлом устанавливается при его открытии. Открытие файла осуществляется функцией fopen. Данная функция возвращает указатель на файл. Указатель на файл необходимо объявлять, например:
FILE * lst;
Здесь FILE-имя типа, описанное в стандартном определении stdio. h;
lst-указатель на файл (логическое имя).
Обращение к функции fopen в программе производится так:
lst= fopen (физическое имя файла, вид использования файла);
Физическое имя файла может, например, быть “prn”-для устройства печати;
“b:zni.f”-для файла zni.f на дискете b:
Вид исполнения.
Если файл открывается для записи или дополнения, но ещё не существует, то он создаётся. Открытие существующего файла для записи приводит к уничтожению его старого содержимого. Попытка прочитать несуществующий файл-это ошибка (fopen выдаёт указатель со значением NULL ).
Для работы с файлами используются библиотечные функции fprintf, fscanf, fgets, fputs. Их применение рассмотрим ниже на примерах. После окончания работы с файлом он должен быть закрыт. Это делается с помощью библиотечной функции fclose, например:
fclose (lst)
lst-указатель на файл;
Рассмотрим организацию ввода информации на печатающее устройство:
/*Работа с файлами (вывод на печатающее устройство )*/
#include<stdio.h>
main ( )
{ int i = 150;
FILE *lst;
/*lst-указатель на файл ( объект типа FILE)*/
lst= fopen (“prn”,”w”);
/*lst получает адрес открытого файла с именем prn, предназначенного для записи в него информации (символ w);
prn-стандартное имя устройства печати, информация из файла с адресом lst будет выводится на печатающее устройство*/
fprintf(lst,”\n число i = %d\n”,i) ;
/*первый параметр функции fprintf-это указатель на соответствующий файл; на печать будет выведена строка: число i = 150*/
fclose (lst);
/*функция fclose закрывает файл с указателем lst теперь ссылку lst можно использовать для другого файла */
Функция fprintf подобна функции printf и отличается от неё тем, что в качестве первого параметра использует указатель на соответствующий файл.
Следующая программа показывает организацию вывода информации на дискету:
/* Работа с файлами (запись информации в файл на дискету)*/
#include < stdio.h >
main ( )
{ int i = 150
FILE *rsd;
Rsd=fopen(“B:ZNI.F”,”r ”);
/*второй параметр функции fopen-теперь “r ”,говорящий о чтении информации*/
fscanf(rsd,”%d”,&i);
/*из файла ZNI.F(дискета В:) будет прочитано значение i*/
printf(“число i=%d(начальное значение i)\n”,i);
while (fscanf(rsg,”%d”,&i)!=EOF)
printf(“число i = %d\n,i”);
/*последовательный вывод целых чисел из файла; вывод прекращается, когда будет достигнут конец файла(ЕОF)*/
fclose(rsd);
}
Первая функция fscanf обеспечивает чтение из файла B:ZNI.F значение целого числа i. Затем полученное значение выводится функцией printf на экран дисплея. Последующий фрагмент программы (начиная с оператора while) позволяет вывести другие целые числа из этого файла, если их там не более одного. После того как чисел в файле не остаётся, функция fscanf выдаёт особое значение EOF-признак конца файла. Его можно использовать для прекращения чтения информации.
Добавим в файл ZNI.F новые данные:
/*Работа с файлами (дополнение файла на дискете)*/
#include < stdio.h >
main ( )
{ int c;
FILE * lds;
lds = fopen(“B:ZNI.F”,”a”);
/*Второй параметр функции fopen - теперь “а” , говорящий о возможности дополнения файла*/
puts (“введите целое число”);
scanf (“%d”,&c);
fprintf (lds,”%d\n”,c);
/*файл ZNI.F будет дополнен первым числом*/
fclose (lds);
}
В ответ на сообщение “введите целое число” необходимо ввести его, и файл добавится одним числом. Если необходимо добавить в файл несколько данных, можно организовать цикл.
С началом работы любой программы автоматически открываются три файла, и для них определяются соответствующие указатели. Первый из них-это файл для стандартного ввода информации с клавиатуры с указателем stdin, второй - для стандартного вывода информации на экран дисплея с указателем stdout, третий - для стандартного вывода ошибок на экран дисплея с указателем stderr. Объекты stdin, stdout, stderr - константы, а не переменные, и им нельзя что-либо присваивать. Файл с указателем stderr обычно используется для хранения различных диагностических сообщений.
Рассмотрим ввод и запись строк в файл. Продемонстрируем вывод информации в стандартный файл для ошибок:
/*Работа с файлами (ввод и запись строк). Вывод информации в стандартный файл для ошибок*/ .
#include <stdio.h>
main ( )
{ char str[50];
FILE *FL
FL=fopen ( “FAL.F”, “w”) ;
puts ( “Введите строку ( до 49 символов)”);
scanf ( “%s”, str);
fputs ( str, FL);
/* Функция fputs записывает в файл строку str*/
fprintf ( stderr, “Демонстрация вывода в стандартный файл для ошибок ”);
/* текст в функции fprintf будет выведен на экран*/
fclose ( FL );
FL=fopen ( “FAL.F”, “r”);
/* Файл открывается для чтения */
fgets ( str, 20, FL);
/* функция fgets считывает из файла FAL.F строку str, максимальная длина которой 20-1=19 ( 20- второй параметр fgets); получившаяся строка оканчивается символом `\0'*/
printf ( “str = %s”, str);
fclose ( FL);
}
После запуска программы на выполнение необходимо ввести строку до 49 символов. На экране появится:
Введите строку ( до 49 символов )
Введем строку:
Технический университет
Демонстрация вывода в стандартный файл для ошибок
Подчеркнутая строка будет записана в файл FAL.F с помощью функции fputs, первый параметр которой ( str ) - идентификатор записываемой строки, а второй (FL)- указатель на соответствующий файл.
Чтение строки обеспечивает функция fgets, первый параметр которой ( str ) - идентификатор читаемой строки, второй - его максимальная длина и третий ( FL) - указатель на соответствующий файл.
В результате на экране появляется строка:
str = “ Технический университет ”
В строке 19 символов, поскольку 20-й символ - это заключительный нуль (`\0').
Рассмотрим пример создания файла и чтения из него информации по определенному условию. Информация, входящая в файл: Ф.И.О. студента, группа, размер стипендии. Требуется получить информацию о студенте, фамилия которого будет введена.
Программа приведена на рис.1. В начало программы необходимо поместить процедуру #include < string.h >, так как в программе будут применены функции, работающие со строковыми переменными. Для удобства работы в программе сразу за описанием типа переменных применен оператор очистки экрана - clrscr (). Создание файла происходит в цикле while. При создании файла student.dat используется признак окончания ввода информации, обозначенный переменной Р. До тех пор, пока переменная Р не получит нулевое значение, будет выполняться цикл while и, следовательно, ввод информации.
После того, как файл создан и закрыт, в переменную fio1 вводится фамилия студента. Далее идет цикл while, в котором читается файл и осуществляется поиск введенной фамилии. Рассмотрим подробно операторы, входящие в этот цикл.
Работа функции fscanf описана выше. В следующем операторе if применена функция feof, аргументом которой является указатель на файл. Эта функция определяет, достигнут ли конец файла. Если конец файла достигнут, то оператор break прервет выполнение цикла. Работа двух последующих операторов fscanf не требует объяснений. Далее в программе применен оператор if. Длина определяется функцией strlen. Если сравниваемые строки оказались одинаковой длины, то выполняется функция strncmp, сравнивающая строки. Первыми двумя аргументами этой функции являются сами строки, а третьим аргументом - длина строки. Если строки совпали, то выводится информация о студенте, фамилия которого была введена.
#include < stdio.h>
#include < string.h>
main ( )
{ char fio [15], gr [6], fio1 [15];
float st;
int p=1;
FILE *lf;
clrscr ( );
lf=fopen ( “student.dat”, “w”);
while (p)
{ printf (“”);
printf (“\n”);
scanf (“%s “,&fio);
fprintf ( lf, “%s”, fio);
printf (“\n”);
scanf (“%s”, &gr);
fprintf ( lf, “%s”,gr);
printf (“\n”);
scanf ( “%f”,&st);
fprintf ( lf, “%f\n”,st);
printf (“\n”);
scanf ( “%d”,&p);
}
fclose (lf);
printf ( );
scanf ( “%s”,&fio1);
lf=fopen (“student.dat”,”r”);
while (1);
{
fscanf (lf,”%s”,&fio);
if (feof (lf)) break;
fscanf (lf,”%s”,&gr);
fscanf (lf,”%f”,&st);
if ( strlen (fio)=strlen (fio1))
if (strncmp(fio,fio1,strlen(fio))=0)
printf (“%s %s %f\n”, fio, gr, st);
}
fclose (lf);
}
1.2 Файлы произвольного доступа
Для выполнения произвольного доступа применяется функция fseek, позволяющая обрабатывать файл подобно массиву и непосредственно достигать любого определенного байта. Эта функция имеет вид:
fseek ( stream, offset, origin );
stream - указатель на файл;
оrigin - указатель направления отсчета.
Функция перемещает ( внутренний ) указатель файла, связанного с потоком stream на новое место в файле, которое вычисляется по смещению offset и указанию направления отсчета origin.
Следующая операция с указанным потоком stream будет выполнена, начиная с той позиции, на которое произошло перемещение. Аргумент origin должен быть одной из следующих констант:
0 - начало файла;
1 - текущая позиция указателя файла;
2 - конец файла.
Для того, чтоб перемещать указатель, необходимо знать количество символов в записи. Для дальнейших рассуждений обозначим номер записи через n, а количество символов в записи - через m.
Рассмотрим ситуацию, когда origin = 0. Тогда для того, чтобы установить указатель на запись с номером n offset должен быть вычислен по следующей формуле:
оffset = ( n-1)*m
Рассмотрим вторую ситуацию, когда origin = 1. Установим указатель на начало файла (offset=0). Для того, чтобы перейти на следующую ( вторую ) запись offset должен быть равен нулю. Для перехода с первой на третью запись offset = m и т.д.
Можно двигаться не только от начала к концу файла, но и в обратном направлении. Для этого offset должен быть отрицательным. Например, если указатель стоял на пятой записи, то для того, чтоб перейти на четвертую offset = -2*m, а для перехода с пятой на третью offset = -3*m и т.д .
Рассмотрим третью ситуацию, когда origin = 2. В этом случае указатель перемещается от конца файла. Параметр offset может быть как с плюсом, так и с минусом. Например, для того, чтобы переместить указатель на предпоследнюю запись, offset должен быть вычислен по формуле: offset = 2*m
При работе с файлами прямого доступа можно выйти за начало или конец файла, поэтому при работе необходимо контролировать эти ситуации, следовательно, необходимо знать размер файла. Приведенные ниже три оператора позволяют определить размер файла.
handle =open ( “имя файла”, O_CREATE);
l = file length (handle);
close (handle);
Переменная handle имеет тип int, а переменная 1 так же, как переменная offset - тип long. После выполнения приведённых выше операторов размер файла содержится в переменной 1. Для работы операторов, определяющих размер файла, перед программой необходимо добавить процедуры:
# include < fcnt.h >
# include < io.h >
На рис.2 представлена программа, демонстрирующая прямой доступ. Первая часть программы, обеспечивающая создание файла практически такая же, как и предыдущая. Исключение состоит в том, что для каждой переменной в операторе fprintf определён размер.
Длина записи определяется, как сумма размеров определённых переменных плюс единица, т.е. для нашего примера n = 28. Далее идёт группа операторов, определяющих длину файла.
Следом идёт оператор, инициализирующий переменную n. Переменная n несёт двойную нагрузку. С одной стороны она является признаком окончания цикла (входит в оператор while), с другой определяет номер записи. Затем вычисляется значение переменной offset по формуле, смысл которой описан выше. Эта формула применена в данной программе, т.к. используемый в дальнейшем оператор fseek работает в параметром origin равным нулю. Оператор if контролирует выход указателя за начало или конец файла. Если выведено значение n равное нулю, то цикл прекращается. Если произошёл выход за конец файла (offset >= 1), то игнорируются все последующие операторы цикла, но работу можно будет продолжать, т.е. ввести следующий номер записи. Если выход за пределы файла не произошёл, то выполняются операторы цикла, смысл которых не требует дополнительных пояснений.
# include <stdio.h>
# include <fcntl.h>
# include <io.h>
main ( )
{char fio[10], gr [5];
float st;
long offset,l;
int p=1, handle, n;
FILE *lf;
clrscr ( );
lf=fopen(“student.dat”,”w”);
while(p)
{
printf(“Введите сведения о студенте”);
printf(“\n Введите Ф.И.О.”);
scanf(“%s”,&fio);
printf(“\n Введите номер группы”);
scanf(“%s”,&gr);
printf(“\n Введите размер стипендии”);
scanf(“%s”,&st);
fprintf(lf,“%15s%6s%6.2f ”,fio,gr,st);
printf(“\n Признак окончания ввода”);
scanf(“%s”,&p);
}
fclose (lf);
handle = open(“student.dat”,O_CREAT);
l=filelength(handle);
close(handle);
n=1;
lf=fopen(“student.dat”,”r ”);
while(n)
{
printf (“Введите номер о записи”);
scanf (“%d”,&n);
offset=(n-1)*28;
if (offset>=1 | | n==0) continue;
fseek (lf,offset,0);
fscanf (lf,”%s %s %f ”,&fio,&gr,&st);
printf (“%15s%6s%6.2f\n”,fio,gr,st);
}
fclose(lf);
}
2. Задание
2.1 Создать файл последовательного доступа. Добавить к файлу несколько записей. Прочитать файл, выполнив указанное в задании действие
2.2 Создать файл прямого доступа. Прочитать одну из записей созданного файла. В вариантах, имеющих нечетный номер, параметр offset взять равным единице, в четных вариантах offset имеет значение 2. При чтении файла необходимо обеспечить проверку, чтобы не допустить выход указателя за предел файла
№ вар |
Задание |
|
Информация, входящая в файл: Ф.И.О., номер телефона, адрес, стоимость переговоров. При чтении файла вывести сведения о клиенте с указанным номером телефона. |
||
Воспользовавшись информацией из варианта №1, найти номер телефона клиента с указанной фамилией. |
||
Воспользовавшись информацией из варианта №1, вывести сведения о клиенте с указанной фамилией. |
||
Информация, входящая в файл: Ф.И.О. автора, название книги, издательство, стоимость. При чтении файла вывести информацию о книгах указанного автора. |
||
Воспользовавшись информацией из варианта №4, получить общую стоимость всех книг. |
||
Воспользовавшись информацией из варианта №4, вывести сведения о всех книгах указанного издательства. |
||
Информация, входящая в файл: Ф.И.О., адрес, место работы,зарплата. При чтении файла вывести информацию о всех сотрудниках ПГУ. |
||
Воспользовавшись информацией из варианта №7, вывести сведения о сотрудниках ПГУ, зарплата которых не превышает 200 тенге. |
||
Воспользовавшись информацией из варианта №7, вывести сведения о сотруднике с указанной фамилией. |
||
Информация, входящая в файл: размер костюма, расход ткани, стоимость, форма. При чтении файла выдать сведения о конкретном размере костюма. |
||
Воспользовавшись информацией из варианта №10, выдать сведения о стоимости всех костюмов. |
||
Воспользовавшись информацией из варианта №10, выдать сведения о костюмах стоимостью 300 тенге |
||
Воспользовавшись информацией из варианта №10, выдать сведения о костюмах, произведенных указанной фирмой. |
||
Информация, входящая в файл: номер рейса, вес багажа, количество вещей. При чтении файла определить количество пассажиров, вес багажа которых превышает 30 кг . |
||
Воспользовавшись информацией из варианта №14, определить средний вес багажа. |
||
Воспользовавшись информацией из варианта №14, определить количество пассажиров, вес багажа которых превосходит средний. |
||
Воспользовавшись информацией из варианта №14, определить общий вес багажа. |
||
Воспользовавшись информацией из варианта №14, определить общее количество вещей. |
||
Информация, входящая в файл: Ф.ИО. студента, группа, оценка по ВТ. При чтении файла подсчитывается средний балл по ВТ. |
||
Воспользовавшись информацией из варианта №19, определить, какое количество студентов имеет неудовлетворительные оценки. |
||
Воспользовавшись информацией из варианта №19, вывести Ф.И.О. студентов, имеющих отличные оценки. |
||
Воспользовавшись информацией из варианта №19, вывести Ф.И.О. студентов, имеющих оценки выше среднего балла. |
||
Информация, входящая в файл: номер детали, наименование, количество, стоимость. При чтении файла определить общую стоимость детали. |
||
Воспользовавшись информацией из варианта №23, определить количество деталей определенного наименования. |
||
Воспользовавшись информацией из варианта №23, определить количество деталей, стоимость которых не превышает 25 тенге. |
Литература
Котлинская Г.П., Галиновский О.И. Программирование на языке Cu. -Мн.: Высш. Шк., 1991. - 156 с.
Подбельский В.В. Язык Cu ++: Учебное пособие. - М.: Финансы и статистика,1995, - 560 с.
Романов В.Ю. Программирование на языке Cu ++. Практический подход. - М.: Компьтер, 1993. - 160 с.
Собоцинский В.В. Практический курс Turbo Cu ++. Основы объктно- ориентированного программирования. - М.: Свет, 1993. - 236 с.
Страуструп Б. Язык программирования Сг ++. - М.: Радио и связь, 1991. - 352 стр.
Уинер Р. Язык турбо Cu . - М.: Мир, 1991. - 384 с.
Юлин В.А., Булатова И.Р. Приглашение к Cu. - Мн.: Высш. Шк., 1990,- 224 с.
Подобные документы
Описание типизированных файлов. Принципы работы с файлами, создание и открытие на запись нового файла. Чтение из файла, открытие существующего файла на чтение. Определение имени файла. Запись в текстовый файл. Описание множества и операции над ними.
реферат [86,4 K], добавлен 07.02.2011Проверка существования и статуса файла. Определение его размера. Открытие файла для чтения, записи, добавления. Закрытие файловых дескрипторов. Запись из переменной в файл. Загрузка файла из сети. Создание и удаление каталога. Функции работы с каталогами.
презентация [133,9 K], добавлен 21.06.2014Файловый ввод/вывод с использованием разных классов. Вызовы операционной системы. Использование вызовов операционной системы. Основные способы открытия файла. Замена файла, связанного со стандартными устройствами ввода/вывода. Операции чтения файла.
курсовая работа [1,1 M], добавлен 09.12.2016Работа с файлами, папками WINDOWS: понятие файла, папки, сохранение, переименование. Вычисление суммы порядковых номеров фамилии и имени. Алгоритм расчета себестоимости. реализация в других программах алгоритма и отчета по нему. Файлы, папки WINDOWS.
контрольная работа [17,9 K], добавлен 05.06.2008Алгоритм и код программы для создания исходного двоичного файла чисел с произвольным количеством элементов, чтения из файла действительных восьмибайтных элементов и подсчёта общего количества элементов файла. Вывод результата работы программы на экран.
контрольная работа [1,0 M], добавлен 23.11.2014Принципы программирования файловой структуры в операционной системе Windows. Свойства и методы класса Tstream. Пример создания, чтения и записи потока. Чтение, запись и внутренняя структура файла. Пример чтения из файла, начиная с заданной позиции.
курсовая работа [251,6 K], добавлен 18.05.2011Разработка приложения Win32, с помощью которого можно получить атрибуты файла (функция GetFileAttributes). Определение даты и времени создания, последнего доступа и последней записи данных в файл. Получение информации о файле по его идентификатору.
курсовая работа [187,3 K], добавлен 27.06.2014Создание программного продукта на языке Pascal в визуальной среде программирования Borland Developer Studio в консольном приложении. Разработка типизированного файла для записи данных и их вывод на экран, добавление данных в конец файла, поиск информации.
курсовая работа [1,0 M], добавлен 04.12.2011Переход от коротких имен файлов к длинным. Особенности кэширования диска. Логическая организация файла. Его физическая организация. Права доступа к файлу. Общая модель файловой системы. Отображаемые в память файлы. Современные архитектуры файловых систем.
презентация [85,4 K], добавлен 18.02.2010Файл - именованная область внешней памяти ПК. Процедуры и функции языка Pascal для работы с файлами прямого и последовательного доступа. Классификация файлов по типу доступа к элементам. Обоснование выбора средств программной реализации блоков.
лабораторная работа [10,4 K], добавлен 13.02.2009