Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Произвольный доступ к файлам.

Поиск

То место в файле, куда записываются данные или откуда они извлекаются, определяется значением указателя записи-чтения файла (текущим указателем файла). При последовательном доступе к файлу этот указатель позиционируется автоматически при любой операции чтения и записи.

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

 

Функция rewind().

 

Прототип:

void rewind(FILE *_stream);

 

Описание:

Помещает текущий указатель позиции файла на начало файла и сбрасывает индикаторы ошибок и конца файла. Функцияrewind(stream) эквивалентна fseek(stream, 0L, SEEK_SET) (см. далее), за исключением того, что rewind() обнуляет признаки конца файла и ошибки, в то время как fseek() обнуляет только признак конца файла.

Функция fseek().

 

Прототип:

int fseek(FILE *_fp, long _offset, int _from);

 

Описание:

Функция fseek() устанавливает текущий указатель файла, соответствующий потоку _fp, в новую позицию, которая расположена по смещению _ offset относительно места в файле, определяемого параметром _from.

Параметр _from может иметь одно из трех значений 0, 1 или 2, которые представлены тремя символическими константами:

 

#define SEEK_CUR 1

#define SEEK_END 2

#define SEEK_SET 0

 

Эти константы могут быть переданы функции fseek() для запроса позиционирования текущего указателя относительно текущей позиции в файле либо конца или начала файла соответственно. Очевидно, что при использовании SEEK_END (2) значение _ offset должно быть меньшн нуля. В этом случае будет выполняться сдвиг указателя от конца к началу файла.

Функция fseek() используется с операциями ввода/вывода в поток. После этой операции можно производить как ввод, так и вывод в поток.

 

Возвращаемое значение:

Функция fseek() возвращает значение 0, если указатель файла успешно перемещен, и ненулевое значение в случае неудачного завершения.

 

Пример:

fseek(fp, 100L, SEEK_SET);

 

Для определения текущей позиции указателя в файле служит функция ftell().

Прототип:

long ftell(FILE *_fp);

 

Описание:

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

Значение, возвращаемое ftell(), можно в дальнейшем использовать при вызове функции fseek().

 

Возвращаемое значение:

Функция ftell() возвращает положение указателя текущей позиции при успешном завершении. При ошибке возвращает -1L, и присваивает переменной errno положительное значение.

 

Пример:

fseek(fp, 0L, 2); //в конец файла

long k = ftell(fp); //длина файла в байтах

 

 

 

Задача 168. Программа печатает произвольный текстовый файл в прямом, а затем в обратном порядке, трактуя его как бинарный файл.

// f_revrs2.cpp печать файла в обратном порядке

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

 

#include "stdafx.h"

#include <conio.h>

#include <iostream>

using namespace std;

 

#define CTRL_Z '\32'

FILE *in;

int main()

{

char namein[15], ch; long count,last;

system("chcp 1251");

printf("Введите путь и имя файла,например,D:\\eddy.txt\n");

gets(namein);

if((in = fopen(namein, "rb"))==NULL) //двоичный для чтения

{ puts("Не могу открыть файл...!");

_getch(); exit(0);

}

 

fseek(in,0L,SEEK_END); //переход к концу файла

last=ftell(in); //размер файла

//печать файла в прямом порядке

for(count=0L;count<last;count++)

{

fseek(in,count,SEEK_SET); ///движение вперед

ch=getc(in);

if(ch!=CTRL_Z && ch!= '\r')

putchar(ch);

}

//печать файла в обратном порядке

for(count=1L;count<=last;count++)

{

fseek(in,-count,SEEK_END); ///движение назад

ch=getc(in);

if(ch!=CTRL_Z && ch!= '\r')//в двоичном коде Ctrl+z

//-обычный символ, а реальный конец файла следует за ним

//\r-аналогично - их не печатать

putchar(ch);

}

fclose (in);_getch();

return 0;

}

 

Задача 169. Программа создает файл–телефонный справочник некоторой телефонной станции Одессы(например, АТС-765).Каждая запись содержит поля:

-номер телефона;

-Фамилия абонента;

-адрес абонента.



Поделиться:


Последнее изменение этой страницы: 2016-12-16; просмотров: 452; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.190.253.224 (0.006 с.)