- •Лабораторная работа №2(7) Работа с файлами
- •1. Ввод и отладка простейшей программы работы с файлами
- •2. Разработка программ типовых алгоритмов работы с файлами
- •3. Работа с файлами с произвольным доступом
- •1. Краткие теоретические сведения по работе с файлами в языке си при вводе/выводе.
- •1.Дополнение (материал по работе с файламими на языке Pascal)
- •Стандартные процедуры работы с файлами
- •Внешние устройства, используемые в качестве файлов
Внешние устройства, используемые в качестве файлов
Связь с внешними устройствами в языке Turbo Pascal осуществляется также через файловые переменные.
В Turbo Pascal существует два типа внешних устройств. Устройства операционной системы и текстовые устройства.
Устройства операционной системы, с которыми осуществляется обмен информацией, могут быть описаны как файлы со стандартными именами. Эти имена следующие:
CON - консоль (как правило, дисплей). С этим устройством стандартно связаны файловые переменные Input и Output.
PRN - печатающее устройство.
COM1, COM2 - имена двух портов.
AUX - синоним COM1.
NUL - фиктивное внешнее устройство.
К текстовым устройствам относятся устройства, не поддерживаемые операционной системой или имеющие другие способы обращения.
2. Тексты программ на языке СИ.
#include<stdio.h>
/*Пример1 открытия файла "test" для чтения и записи без проверки
наличия ошибки при вызове функции fopen()*/
void main()
{
FILE *fp;
fp=fopen("test","wt");
fclose(fp);
return;
}
-----------------------------------------------------------------------------
#include<stdio.h>
/*Пример2 открытия файла "test" для чтения и записи с проверкой
наличия ошибки при вызове функции fopen()*/
int main()
{
FILE *fp;
if((fp=fopen("test","wt"))==NULL)
{
/* При ошибке открытия файла "test"
выдать сообщение об ошибке и выйти
с кодом возврата 1*/
printf("%s\n","ошибка открытия файла\n");
return(1);
}
fclose(fp);
return 0;
}
-----------------------------------------------------------------------------
#include<stdio.h>
/*Пример3 программы открытия файла "test1" только
для чтения с проверкой
наличия ошибки при вызове функции fopen()*/
int main()
{
FILE *fp;
if((fp=fopen("test1","r"))==NULL)
{/*При попытке открыть несуществующий файл "test1"
вывести сообщение об ошибке и выйти с кодом
возврата 1*/
printf("%s\n","ошибка открытия файла\n");
return(1);
}
fclose(fp);
return 0;
}
-----------------------------------------------------------------------------
#include<stdio.h>
/*Пример4-программы создания файла "test" с последовательным доступом*/
int main()
{
FILE *fp;
/*Открыть новый файл "test" для записи
как текстовый*/
if((fp=fopen("TEST.TXT","wt"))==NULL)
{/*При попытке открыть несуществующий файл "test"
вывести сообщение об ошибке и выйти с кодом
возврата 1*/
printf("%s\n","ошибка открытия файла\n");
return(1);
}
/* Добавление строк в файл с помощью функции FPRINRF()*/
fprintf(fp,"%s\n","Иван");
fprintf(fp,"%s\n","Петр");
fprintf(fp,"%s\n","Михаил");
fprintf(fp,"%s\n","Aндрей");
fprintf(fp,"%s\n","Никифор");
fclose(fp);
return 0;
}
-----------------------------------------------------------------------------
#include<stdio.h>
/*Пример5-программы чтения и вывода
ранее созданного файла "test" с последовательным доступом*/
int main()
{
FILE *fp;
char StrBuf[80];
/*Открыть уже сущесвующий файл "test" для чтения
как текстовый*/
if((fp=fopen("TEST.TXT","rt"))==NULL)
{/*При попытке открыть несуществующий файл "test"
вывести сообщение об ошибке и выйти с кодом
возврата 1*/
printf("%s\n","ошибка открытия файла\n");
return(1);
}
/* Последовательно читать и выводить
содержимое файла пока функцией FGETS()
не будет возвращен NULL, указывающий на конец
файла */
while((fgets(StrBuf,80,fp))!=NULL)
{
printf("%s\n",StrBuf);
}
fclose(fp);
return 0;
}
-----------------------------------------------------------------------------
#include<stdio.h>
#include<string.h>
/*Пример6-программы чтения,изменения и вывода
ранее созданного файла "test" с последовательным доступом*/
int main()
{
FILE *fp1;
char StrBuf[80];
char NameCmp[]="Михаил\n";
long int PosCur;
/*Открыть уже существующий файл "test" для чтения
и внесения изменений как текстовый*/
if((fp1=fopen("TEST.TXT","r+t"))==NULL)
{
/*При попытке открыть несуществующий файл "test"
вывести сообщение об ошибке и выйти с кодом
возврата 1*/
printf("%s\n","ошибка открытия файла\n");
return(1);
}
/* Последовательно читать
содержимое файла пока функцией FGETS()
не будет возвращен NULL, указывающий на конец
файла */
while((fgets(StrBuf,80,fp1))!=NULL)
{
/* Получить текущее значение файлового указателя с помощью
функции FTELL() */
PosCur=ftell(fp1);
/* Проверка на совпадение прочитанного имени
с искомой строкой */
if(stricmp(StrBuf,NameCmp)==0)
{
/* При совпадении передвинуть указатель с помощью
функции fseek() в начало найденной строки и записать
на это место новую строку*/
fseek(fp1,(PosCur-strlen(NameCmp)-1),SEEK_SET);
fprintf(fp1,"%s\n","Федор");
}
}
/* Указатель fseek - на начало файла*/
fseek(fp1,0,SEEK_SET);
/*Последовательно читать и выводить
содержимое файла, пока функция fgets()
не возвратит NULL, означающий конец файла*/
while((fgets(StrBuf,80,fp1)) !=NULL)
{
printf("%s\n",StrBuf);
}
fclose(fp1);
return 0;
}
#include<stdio.h>
#include<string.h>
/*Пример7-программы создания текстового файла
с произвольным доступом*/
/*Задание используемой структуры записи*/
typedef struct Names {
char FirstName[20];
} NAMES;
int main()
{
FILE *fp1;
NAMES NameRecord; /*Структура записи*/
/* Создать файл для исправления */
if((fp1=fopen("NAMES.BIN","w+b"))==NULL)
{
printf("%s\n","ошибка открытия файла\n");
return(1);
}
/* Скопировать имена в запись, а записи вписать в файл */
strcpy(NameRecord.FirstName,"САША");
fwrite(&NameRecord,sizeof(NAMES),1,fp1);
strcpy(NameRecord.FirstName,"ДАША");
fwrite(&NameRecord,sizeof(NAMES),1,fp1);
strcpy(NameRecord.FirstName,"МАША");
fwrite(&NameRecord,sizeof(NAMES),1,fp1);
strcpy(NameRecord.FirstName,"ГЛАША");
fwrite(&NameRecord,sizeof(NAMES),1,fp1);
strcpy(NameRecord.FirstName,"ЯША");
fwrite(&NameRecord,sizeof(NAMES),1,fp1);
fclose(fp1);
return 0;
}
#include<stdio.h>
#include<string.h>
/*Пример8-программы чтения и вывода информации из файла
с произвольным доступом*/
/*Задание используемой структуры записи*/
typedef struct Names {
char FirstName[20];
} NAMES;
int main()
{
FILE *fp1;
NAMES NameRecord; /*Структура записи*/
int Err; /* Код возврата ошибки */
/* Открыть уже существующий двоичный файл
с именем NAMES.BIN
только для чтения */
if((fp1=fopen("NAMES.BIN","rb"))==NULL)
{
printf("%s\n","ошибка открытия файла\n");
return(1);
}
/* Последовательный просмотр файла и
вывод значений */
do {
Err=fread(&NameRecord,sizeof(NAMES),1,fp1);
if (Err) /* Если Err равно нулю,
то есть вызов fread() успешен,
то напечатать очередное имя */
printf("%s\n",NameRecord.FirstName);
} while (Err);
fclose(fp1);
return 0;
}