Запись - чтение информации
Все действия по чтению-записи данных в файл можно разделить на три группы:
- операции посимвольного ввода-вывода;
- операции построчного ввода-вывода;
- операции ввода-вывода по блокам.
Рассмотрим основные функции, применяемые в каждой из указанных трех групп операций.
Посимвольный ввод-вывод
В функциях посимвольного ввода-вывода происходит прием одного символа из файла или передача одного символа в файл:
int fgetc(FILE *f) | - считывает и возвращает символ из файла f; |
int fputc(int ch, FILE *f) | - записывает в файл f код ch символа. |
Построчный ввод-вывод
В функциях построчного ввода-вывода происходит перенос из файла, или в файл строк символов:
int fgets (char *S, int m, FILE *f) | - чтение из файла f в строку S m байт; |
int fputs (char *S, FILE *f) | - запись в файл f строки S до тех пор, пока не встретится '\0', который в файл не переносится и на символ '\n' не заменяется. |
Блоковый ввод-вывод
В функциях блокового ввода-вывода работа происходит с целыми блоками информации:
int fread(void *p, int size, int n, FILE *f) | - считывает n блоков по size байт каждый из файла f в область памяти с указателем p (необходимо заранее отвести память под считываемый блок); |
int fwrite (void *p, int size, int n, FILE *f) | - записывает n блоков по size байт каждый из области памяти с указателем p в файл f. |
Форматированный ввод-вывод производится функциями:
int fscanf(FILE *f, char *формат, список адресов объектов) | - считывает из файла f информацию для объектов в соответствии с указанными форматами; |
int fprintf(FILE *f, char *формат, список объектов) | - записывает в файл f объекты, указанные в списке в соответствии с форматами. |
Данные функции аналогичны функциям scanf() и printf(), рассмотренным раньше, только добавлен параметр – указатель на файл.
Текстовые файлы
Для работы с текстовыми файлами удобнее всего пользоваться функциями fprintf(), fscanf(), fgets() и fputs().
Создание текстовых результирующих файлов обычно необходимо для оформления отчетов по лабораторным и курсовым работам.
Рассмотрим пример создания текстового файла:
#include<stdio.h>
void main(void) {
FILE *f1;
int a=2, b=3;
If(!(f1=fopen(“d:\\work\\f_rez.txt”,”w+t”)))
{
puts(“Файл не создан!”);
return;
}
fprintf(f1,” Файл результатов \n”);
fprintf(f1,” %d плюс %d = %d\n”,a,b,a+b);
fclose(f1);
}
Просмотрев содержимое файла, можно убедиться, что данные в нем располагаются точно как на экране при использовании функции printf().
Бинарные файлы
Бинарные (двоичные) файлы обычно используются для организации баз данных, состоящих, как правило, из объектов структурного типа. При чтении-записи бинарных файлов удобнее всего пользоваться функциями, выполняемыми блоковый ввод-вывод fread() и fwrite().
Рассмотрим наиболее распространенные функции с помощью которых можно организовать работу с файлами:
int fileno(FILE *f) | – возвращает значение дескриптора файла f - fd (число, определяющее номер файла); |
long filelength(int fd) | – возвращает длину файла, имеющего номер (дескриптор) fd в байтах; |
int chsize(int fd, long pos) | – выполняет изменение размера файла, имеющего номер fd, признак конца файла устанавливается после байта с номером pos; |
intfseek(FILE *f, long size, int kod) | – выполняет смещение указателя файла f на size байт в направлении признака kod: 0 - от начала файла; 1 - от текущей позиции указателя; 2 - от конца файла; |
long ftell(FILE *f) | – возвращает значение указателя на текущую позицию файла (-1 – ошибка); |
intfeof(FILE *f) | – возвращает ненулевое значение при правильной записи признака конца файла; |
intfgetpos(FILE *f, long *pos) | – определяет значение текущей позиции pos файла f, возвращает 0 при успешном завершении. |
Пример программы работы с файлом структур:
. . .
struct Sved {
char Fam[30];
float S_Bal;
} zap,zapt;
char Spis[]="c:\\bc31\\work\\Sp.dat";
FILE *F_zap;
FILE* Open_file(char *, char *);
void main (void) {
int i, j, kodR, size = sizeof(Sved);
while(1) {
puts("Создание - 1\nПросмотр - 2\nДобавление - 3\nВыход - 0");
switch(kodR = getch())
{
case ‘1’: case ‘3’:
if(kodR==1) F_zap = Open_file (Spis,"w+");
else F_zap = Open_file (Spis,"a+");
while(2) {
cout << "\n Fam "; cin >> zap.Fam;
if((zap.Fam[0])=='0') break;
cout << "\n Средний балл: ";
cin >> zap.S_Bal;
fwrite(&zap,1,size,F_zap);
}
fclose(F_zap);
break;
case ‘2’: F_zap = Open_file (Spis,"r+"); int nom=1;
while(2) {
if(!fread(&zap,size, 1, F_zap)) break;
printf(" %2d: %20s %5.2f\n", nom++, zap.Fam, zap.S_Bal);
}
fclose(F_zap);
break;
case ‘0’: return; // exit(0);
} // Конец While(1)
} // Конец Switc
} // Конец программы
FILE* Open_file(char *file, char *kod)
{
FILE *f;
if(!(f = fopen(file, kod)))
{
puts(“Файл не создан!”);
getch();
exit(1);
}
else return f;
}
Список рекомендуемой литературы
1. Бусько В.Л., Корбит А.Г. и др. Программирование. Лабораторный практикум для студентов 1-2-го курсов всех специальностей БГУИР всех форм обучения. Часть 2. Основы программирования на алгоритмическом языке С.
2. Аксенкин М.А., Целобенок О.Н. Язык С. - Мн.: Унiверсiтэцкае, 1995. – 302 c.
3. Березин Б.И., Березин С.Б. Начальный курс С и С++. – М.: Диалог-МРТИ,1999. - 288 с.
4. Берри В., Микинз Б. Язык СИ: введение для программистов. - М.: Финансы и статистика,1988.
5. Больски М.Н. Язык программирования СИ. Справочник. - М.: Радио и связь, 1988.
6. Демидович Е.М. Основы алгоритмизации и программирования. Язык СИ. - Мн.: Бестпринт, 2001. – 440 c.
7. Касаткин А.И., Вольвачев А.Н. Профессиональное программирование на языке Си: Oт Turbo–C к Borland C++: Справочное пособие – Мн.: Вышэйшая школа,1992. - 240 с.
8. Касаткин А.Н. Профессиональное программирование на языке СИ. Управление ресурсами. Справочное пособие. Мн.: Высш. школа.1992
9. Керниган Б., Ритчи Д. Язык программирования Си. - М.: Финансы и статистика,1992. - 271 с.
10. Климова Л.И. С++. Практическое программирование. - М.: Кудиц-Образ, 2001. – 587 c.
11. Котлинская Г.П., Галиновский О.И. Программирование на языке СИ. - Мн.: Выш.шк., 1991. – 155 c.
12. Подбельский В.В., Фомин С.С. Программирование на языке Си. М.: Финансы и статистика. 2001.
13. Романовская Л.М., Русс Т.В., Свитковский С.Г. Программирование в среде СИ для ПЭВМ ЕС. - М.: Финансы и статистика, 1992.
14. Страуструп Б. Язык программирования С++. 2-е изд.: В 2 т. Киев: ДиаСофт,1993.
15. Тимофеев В.В. Программирование в среде С++ Builder 5. - М.: БИНОМ, 2000.
16. Уингер Р. Язык Турбо СИ. - М.: Мир, 1991.
17. Уэйт М., Прама С., Мартин Д. Язык СИ. Руководство для начинающих. - М.: Мир, 1988.
18. Фьюэр А. Задачи по языку СИ. - М.: Финансы и статистика, 1985.
19. Хэнкок Л., Кригер М. Введение в программирование на языке СИ. - М.: Радио и связь,1986.
20. Шилд Г. Программирование на Borland С++. - Мн.: ПОПУРРИ, 1999. – 800 c.
21. Юлин В.А., Булатова И.Р. Приглашение к СИ. - Мн.: Высш.шк., 1990.
Список используемой литературы
1. Синицын А.К. Конспект лекций по курсу «Программирование» для студентов 1-2-го курсов радиотехнических специальностей. - Мн.: БГУИР, 2001. - 75с.: ил. 10.
Приложение 1