- •3 Работа с файлами
- •3.1 Открытие и закрытие файлов
- •Void perror(const char *str);
- •3.2 Запись данных в файл и чтение данных из файла
- •Int fputc(int ch, file *fp);
- •Int fgetc(file *fp);
- •Int fputs(char*string, file *fp);
- •Int sscanf(char *buf, char *format [,указатель]…);
- •Int fwrite(void *ptr, int size, int n, file *fp);
- •Int fread(void *ptr,int size,int n,file *fp);
- •Int fprintf(file *fp, char *format [,аргумент]…);
- •Int sprintf(char *buf, char *format [,аргумент]…);
- •3.3 Произвольный доступ к файлу
- •Int fseek(file *fp, long offset, int from_where);
3.3 Произвольный доступ к файлу
При обмене данными с файлом (записи и чтении) – место, куда записывается или считывается информация, определяется указателем чтения-записи.
Функция установки указателя чтения- записи на начало файла имеет прототип void rewind(FILE *fp);
Например: rewind(fp);
Функция установки указателя чтения-записи в произвольную точку файла имеет прототип:
Int fseek(file *fp, long offset, int from_where);
Эта функция устанавливает указатель чтения-записи в файле, открытому через поток fp, на offset байт вправо или влево. Если offset>0, то указатель сдвигается в сторону конца файла, если offset<0, то указатель сдвигается в сторону начала файла. Параметр from_where задает точку отсчета для сдвига: SEEK_SET – сдвиг от начала файла, SEEK_CUR – сдвиг от текущей позиции указателя, SEEK_END – сдвиг от конца файла. В случае успеха функция возвращает 0, иначе – EOF.
Установка указателя чтения-записи левее начала файла считается ошибкой, установка указателя правее конца файла делает значение указателя записи-чтения неопределенным. Например:
//установка казателя чтения-записи через 10байт от начала файла fseek(fp,10L,SEEK_SET);
Функция определения текущего положения указателя чтения-записи имеет прототип: long ftell(FILE *fp);
Эта функция возвращает значение в байтах (тип long) от начала файла до текущего положения указателя чтения-записи файла, открытого через поток fp. В случае ошибки функция возвращает –1L.
Например:
long cur=ftell(fp);
Пример 3.8 Запись и добавление в файл блоков данных (структур) и чтение одной заданной структуры записанных ранее в файл структур.
#include<stdio.h> |
#define n 3 |
struct REC{unsigned id; |
char name[20]; |
unsigned mark;}; |
int main() |
{FILE *out,*in; |
REC rec; |
int flag, sz=sizeof(REC); |
long len,kol,n; |
if((out=fopen("mark.txt","wb"))==NULL) |
{perror("Выходной файл не открыт"); return 1; } |
do{ |
puts("Введіть № запису, прізвище, оцінку(0..5)"); |
scanf("%d",&rec.id); |
gets(rec.name); |
scanf("%d",&rec.mark); |
fwrite(&rec,sz,1,out); |
puts("Продолжить ввод? Да-1, Нет-0"); |
scanf("%d",&flag); |
}while(flag); |
fclose(out); |
if((in=fopen("mark.txt","rb"))==NULL) |
{perror("Входной файл не открыт"); return 2;} |
fseek(in,0,SEEK_END); |
len=ftell(in); |
kol=len/sz; |
printf("В файлі %d записів\n", kol); |
puts("Введіть номер запису для читання:"); |
scanf("%ld",&n); |
if(n>0&&n<=kol) |
{fseek(in,(i-1)*sz, SEEK_SET); |
fread(&rec,sz,1,in); |
printf("id=%d name: %s ", rec.id_rec,rec.name); |
printf("mark: %d\n",rec.mark); } |
else puts("Поза файлом!"); |
fclose(in); |
return 0; } |
