Студопедия.Орг Главная | Случайная страница | Контакты | Мы поможем в написании вашей работы!  
 

Int fseek ( FILE *stream, long offset, int origin )



Функцияпозволяет обрабатывать файл подобно массиву и непосредственно достигать любого определенного байта в файле, открытого функцией fopen(). Функция имеет три аргумента:

1. указатель типа FILE, на файл, в котором ведется поиск.

2. аргумент, указывающий на шаг, с которым необходимо передвигаться от начальной точки. Он должен иметь тип long, и знак в зависимости от направления поиска.

3. Код, определяющий точку отсчета:

0 - начало файла, (SEEK_SET)

1 - текущая позиция (SEEK_CUR)

2 - конец файла. (SEEK_END)

Функция fseek() возвращает значение типа int. В случае успешного завершения – 0, в случае ошибки – значение, отличное от нуля.

Для определения текущей позиции файлового указателя используется функция:

long ftell(FILE *stream)

Пример побайтовой чередующейся печати файла в прямом и обратном порядке

main()

{ FILE *fi;

long offset = OL;

if((fi=fopen("proba","r"))==0)

{ printf("Не возможно открыть файл ");

return (1);

}

else

{ while(fseek (fi, offset++, 0) == 0)

{ putchar (getc(fi));

if(fseek (fi, -(offset+3), 2) == 0)

putchar (getc (fi));

}

}

fclose(fi);

}

Наша программа печатает первый символ файла, затем последний, затем второй, затем предпоследний. Код 2 - означает, что мы читаем с конца файла. +3 - мы пытаемся обойти последние символы в файле, записываемые системой (EOF и 2 символа новой строки). Проверить это можно экспериментально, т.к. для каждой системы это сочетание различно.

Теперь попытаемся изменить содержимое четвертой строки файла. Для этого нужно считать все строки, найти четвертую, заменить ее и сохранить изменения. Функции fseek() и ftell() будем использовать для перемещения указателя внутри файла.

#include <stdio.h>

#include <string.h>

main()

{ FILE *fptr;

char StrBuf[80];

char NameCmp[]=”Петров\n”;

long int CurPos;

if ((fptr=fopen("stopy.txt","r+t"))==NULL)

{ printf(“Ошибка открытия файла”);

return (1); //выход с кодом возврата 1

}

while(fgets(StrBuf, 80, fptr)!=NULL)

{ CurPos=ftell(fptr);

//При совпадении строк передвинуть указатель на начало строки

//и записать на это место новую строку

if(stricmp(StrBuf, NameCmp)==0)

{ fseek(fptr,(CurPos-strlen(NameCmp)-1), SEEK_SET);

frintf(fptr, “%s|n”,”Петрова”);

}

}

fseek(fptr, 0, SEEK_SET) // на начало файла

//последовательно прочитать и вывести содержимое файла,

//пока fgets() не возвратит NULL, означающий конец файла

while(fgets(StrBuf, 80, fptr)!=NULL)

puts(StrBuf);

fclose(fptr);

return 0;

}

Результат: Иванов

Каренина

Обломов

Петрова

идоров

В файлах с последовательным доступом запись новой строки производится поверх старой строки. Поэтому пропала первая буква последней строки.

В таких файлах проще дописывать информацию в конец файла, а вот исправление информации в середине файла сопряжено с рядом трудностей.

В файлах, где единицей хранения информации является запись (структура), целесообразно использовать для чтения и записи функции fread() и fwrite().

Функция fwrite() обеспечивает вывод данных

int fwrite(void *ptr, unsegned size, int k, FILE *stream);

void *ptr - указатель переменной любого типа, из которой считаются записи в файл

unsegned size - длина записи в байтах

int k - количество помещаемых в файл записей размером size

FILE *stream - имя указателя файла

Функция возвращает число реально записанных элементов, которое равно числу затребованных элементов. Если же записано меньше элементов, чем затребовано при вызове – произошел сбой.

Для чтения из файла используется функция fread().

int fread(void *ptr, unsegned size, int k, FILE *stream);

void *ptr - указатель переменной любого типа, в которую читаются записи

unsegned size - длина записи в байтах

int k - количество считываемых записей размером size

FILE *stream - имя указателя файла

Функция возвращает число реально прочитанных элементов.

Номер каждой записи в файле рассчитывается на основе размера записи и текущего положения файлового указателя. Например, если длина записи равна 24 байтам, а текущая позиция равна 0, то номер записи можно вычислить следующим образом:

Recorg_Number=Position / Record_Size (0/24=0)

Вычислить, сохранить и извлечь запись по номеру можно в следующем примере:

#include <stdio.h>

#include <string.h>

#include <conio.h>

#include <stdlib.h>

struct str_Names { long int RecNo;

char FirstName[20]; };

main()

{ FILE *fptr;

struct str_Names NameRecord;

char ch;

if ((fptr=fopen("Names.bin","w+b"))==NULL)

{ printf(“Ошибка открытия файла”);

return (1); //выход с кодом возврата 1

}

strcpy(NameRecord.FirstName, “Иванов”);

NameRecord.RecNo=(ftell(fptr) / sizeof(struct str_Names));

fwrite(&NameRecord, sizeof(struct str_Names), 1, fptr);

strcpy(NameRecord.FirstName, “ Каренина ”);

NameRecord.RecNo=(ftell(fptr) / sizeof(struct str_Names));

fwrite(&NameRecord, sizeof(struct str_Names), 1, fptr);

strcpy(NameRecord.FirstName, “ Обломов ”);

NameRecord.RecNo=(ftell(fptr) / sizeof(struct str_Names));

fwrite(&NameRecord, sizeof(struct str_Names), 1, fptr);

strcpy(NameRecord.FirstName, “ Петров”);

NameRecord.RecNo=(ftell(fptr) / sizeof(struct str_Names));

fwrite(&NameRecord, sizeof(struct str_Names), 1, fptr);

strcpy(NameRecord.FirstName, “ Cидоров ”);

NameRecord.RecNo=(ftell(fptr) / sizeof(struct str_Names));

fwrite(&NameRecord, sizeof(struct str_Names), 1, fptr);

fseek(fptr,0,SEEK_SET)

//последовательный просмотр файла и вывод значений

do

{ printf(“\n%s\n”, ”Введите цифру от 0 до 4”);

printf(“\n%s\n”, ”Нажмите любую другую клавишу для окончания”);

ch=getch();

if(ch>=’0’ && ch<=’4’)

{ fseek(fptr, (ch-48)*sizeof(struct str_Names), SEEK_SET);

fread(&NameRecord.FirstName, sizeof(struct str_Names), 1, fptr);

printf(“\n%s%d”, ”Запись №”, NameRecord.RecNo);

printf(“\n%s%s\n”, ”Имя: ”, NameRecord.FirstName);

printf(“%s|n”, NameRecord.FirstName);

}

else break;

} while (1);

fclose(fptr);

return 0;

}

Результат: Введите цифру от 0 до 4

Нажмите любую другую клавишу для окончания

Запись №1

Имя: Иванов

Введите цифру от 0 до 4

Нажмите любую другую клавишу для окончания

Запись №4

Имя: Петров

Введите цифру от 0 до 4

Нажмите любую другую клавишу для окончания

2.2. ПОРЯДОК ВЫПОЛНЕНИЯ РАБОТЫ.

1. Изучить материал данного методического пособия, привлекая лекции и дополнительную литературу;

2. Разработать схемы алгоритмов и программу для обработки данных в соответствии с конкретным вариантом.

2.3. ВАРИАНТЫ ЗАДАНИЙ

1. В файле находятся вещественные числа. Определить количество элементов файла, величина которых меньше среднего арифметического всех элементов данного файла.

2. На основе структуры создать произвольную базу данных. Данные хранятся в файле. Программа должна содержать следующие функции:

- ввод новых записей в файл;

- удаление записей из файла;

- поиск записей по любой комбинации признаков в файле;

- корректировка записей;

- вывод данных из файла.

3. Создать файл, содержащий сведения о товарах, хранящихся на складе: шифр, наименование, количество единиц, стоимость единицы. Написать и протестировать функции:

- сортировки записей в порядке возрастания шифра товара;

- получения стоимости товаров, отобранных по заданному ключу.

2.4. КОНТРОЛЬНЫЕ ВОПРОСЫ

1. Что такое бинарный файл?

2. Что такое текстовый файл и его отличие от бинарного?

3. Какие функции используются для обмена данными между оперативной памятью и файлом?

4. В чем различие между последовательным и произвольным доступом к файлу?

5. Какое значение возвращает функция fopen()?

6. Что собой представляет тип FILE?


3. ЛАБОРАТОРНАЯ РАБОТА №3

Цель данной лабораторной работы заключается в ознакомлении с механизмами объектно-ориентированного программирования: инкапсуляцией, перегрузкой операций и функций, наследованием.

3.1. МЕТОДИЧЕСКАЯ ЧАСТЬ

С++ - язык объектно-ориентированного программирования (ООП). В основе ООП лежат три основные концепции: инкапсуляция, полиморфизм и наследование.





Дата публикования: 2015-02-22; Прочитано: 391 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!



studopedia.org - Студопедия.Орг - 2014-2024 год. Студопедия не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования (0.013 с)...