Позиционирование в текстовом файле
Текстовые файлы являются по своей природе файлами последовательного доступа. Единственным исключением из этого правила является позиционирование (возврат) к уже прочитанному фрагменту текста при помощи функции fseek . Но для этого необходимо при первоначальном последовательном просмотре файла определить текущую позицию этого фрагмента в файле функций ftell, вызвав ее перед функцией чтения. Данный случай иллюстрирует программа постраничного просмотра текстового файла:
//------------------------------------------------------bk58-01.cpp
#include <stdio.h>
#include <conio.h>
FILE *fd;
char name[30];
int NP; // Количество страниц в файле
int n; // Номер текущей страницы
long POS[100]; // Массив указателей начала
int i; // страниц в файле
char str[80];
void main()
{
printf("Имя файла:"); // Открыть текстовый файл
gets(name);
if ((fd=fopen(name,"r"))==NULL) exit(1);
for (NP=0; NP< 100; NP++)
{ // Просмотр страниц файла
POS[NP]=ftell(fd); // Запомнить начало страницы
for (i=0; i< 20; i++) // Чтение строк страницы
if (fgets(str,80,fd)==NULL)
break; // Конец файла - выход из цикла
if (i < 20) break; // Неполная страница - выход
}
while(1)
{
clrscr();
gotoxy(1,23);
printf("Номер станицы:");
scanf("%d",&n);
if ((n < NP) || (n < 0)) break;
fseek(fd,POS[n],SEEK_SET); // Указатель на страницу n
for (i=0; i< 20; i++) // Повторное чтение страницы
{ // и вывод на экран
if (fgets(str,80,fd)==NULL) break;
gotoxy(1,1+i);
puts(str);
}
}
}