Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Ноября 2009 года

Лекция 19

КОНЕЦ ЛЕКЦИИ

Чтение файла посимвольно
void ReadChFile(FILE *in, char* filename)
// FILE *in - указатель на файл
// char* filename имя файла
{int ch;
if ((in=fopen(filename,"r"))!=NULL)
// открываем File для чтения,
// проверяя существует ли он
{ do
{ ch = getc(in);
putc(ch,stdout);

/* посылаем ch на стандартный вывод*/
}
while (ch!= EOF);
fclose(in); /* закрываем файл */
}
else
printf ("Файл не открывается\n");
}

Работа с индикатором позиции файла
Для каждого файла после его открытия определяется индикатор позиции, который указывает на смещение от начала файла в байтах.
Тип индикатора позиции определяется как
typedef long fpos_t

Для работы с индикатором позиции применяются следующие функции:

void rewind(FILE* stream);
Устанавливает индикатор позиции на начало файла. Индикаторы ошибки и конца файла сбрасываются.

int fseek(FILE* stream, long offset, int mode);
Сдвигает индикатор позиции файла на offset байт. Параметр mode определяет режим сдвига и может принимать следующие значения:
SEEK_SET–
от начала файла;
SEEK_CUR –
от текущей позиции;
SEEK_END –
от конца файла

long ftell(FILE* stream);
В случае успеха возвращает текущую позицию файла, иначе возвращает -1.

int fgetpos(FILE* stream, fpos_t* pos);
Работает аналогично ftell, но возвращает текущую позицию в pos.

Функция fseek возвращает 0 в случае успешного завершения, так что выражение
if (!fseek(f1, 0, SEEK_END)) filesize=ftell(f1)
позволяет получить информацию о длине файла в байтах.

При работе с текстовым потоком должны использоваться только следующие комбинации значений параметра:
mode offset
SEEK_SET 0 или ftell
SEEK_CUR 0
SEEK_END 0

int fsetpos(FILE* stream, const fpos_t* pos);

Устанавливает индикатор позиции файла в позицию, на которую указывает pos. Индикатор конца файла сбрасывается. Код возврата: удача – 0, неудача – не 0.

printf("Input an index: ");
scanf("%u", &i);
//устанавливает указатель на нужную запись
fseek(in, i*sizeof(struct emp),SEEK_SET);
if(!fread(&s,sizeof(struct emp),1, in))
{printf("The wrong index.\n");
return;}
printf("\tcode = %d name = %s\n",s.code, s.name);

// сортировка справочника
int SortSpr(char *filename)
{struct record_spr
{
int shifr;
char name[20];
};
record_spr z1,z2;
long k, i, j;
long filesize;
FILE* f1;

cout<<"сортировка справочника"<<endl;
if(!(f1=fopen(filename,"r+b")))
{
cout << "Open spr file failed\n";
return 1;
}
if (!fseek(f1, 0, SEEK_END))
filesize = ftell(f1);
k=filesize / sizeof z1;
rewind(f1);
for (i=k-1; i>0; i--)
for (j=0; j<i; j++)
{ fseek(f1,(sizeof z1)*j,SEEK_SET);
fread(&z1, sizeof z1, 1, f1);
fread(&z2, sizeof z1, 1, f1);
if (z1.shifr>z2.shifr)
{ fseek(f1,(sizeof z1)*j, SEEK_SET);
fwrite(&z2, sizeof z1, 1, f1);
fwrite(&z1, sizeof z1, 1, f1);
}
}

fclose(f1);
return 0;

}

Дополнительные функции

int remove(const char* filename);
Удаляет файл с именем filename. В случае удачи возвращает 0, иначе возвращает не 0.

int rename(const char* old_filename, const char* new_filename);
Переименовывает файл. В случае удачи возвращает 0, иначе возвращает не 0.

FILE* tmpfile(void);
Создает временный файл в режиме w+b. В случае неудачи возвращает NULL.

char* tmpname(char* str);
Возвращает имя временного файла. Максимальное число имен равно (для Windows) 32767, максимальная длина имени – 255. В случае удачи возвращает str, иначе возвращает NULL.

 

Примеры
int renFile(char *filename)
{
if(rename(filename, "C:\\emp.txt"))
{
printf("There is no such a file.\n");
return 0;
}
printf("The file was renamed.\n");
return 1;

}

int remFile(char *filename)

{

if(remove(filename))
{
printf("There is no such a file.\n");
return 0;
}
printf("The file was deleted.\n");
return 1;

}

Пример обработки файла блоками

Пусть имеется файл с записями следующей структуры:

struct TPrice {

int goods;

// код товара, не может быть равен нулю

int seller; //код продавца, не равен нулю

int price; // продажная цена товара

} p1,p2;

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

Это, в свою очередь, достигается, если файл отсортирован по коду товара, или если для его создания использовалась следующая программа (в ней опущена проверка на уникальность кода товара, которую предлагается выполнить самостоятельно):

void CreateFile(char *filename)

{if((f1=fopen(filename,"wt"))!=NULL)

{

<== предыдущая лекция | следующая лекция ==>
Извлекает из потока символ и помещает его в ch. Функция возвращает ссылку на текущий поток | 
Поделиться с друзьями:


Дата добавления: 2014-01-07; Просмотров: 254; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.015 сек.