Быстро искать местоположение в файле - PullRequest
0 голосов
/ 28 марта 2012

У меня есть файл с большим количеством чисел, каждое число разделено пробелом.

Такие как: 124 1212 5 654 74231 ...

Как быстро найти N-ное число в этом файле?

Я думаю, fseek() может не работать, потому что измеряется байтами, и я могу получить N-е число по:

 int i;
 for (i=0;i!=N-1;++i) fscanf(somefile,"%d",&variable);

Но я думаю, что может быть какой-то способ более эффективный?

Ответы [ 2 ]

5 голосов
/ 28 марта 2012

Прочитайте весь файл один раз и создайте индекс для некоторых точек данных в файле (например, 1000 точек).Каждая запись в индексе может отображать местоположение в файле на N-е число, начиная с этого местоположения.Построив этот индекс, каждый раз, когда вы ищете N-е число, сначала найдите в индексе самую близкую запись, которая сообщает вам самую близкую известную точку в файле, к которой вы можете fseek.затем выполните поиск, используя fscanf, чтобы найти значение.Это уменьшает время поиска с ценой использования некоторой памяти для индекса.

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

индекс может выглядеть так:смещение файла 1, номер 1) (смещение файла 2, номер 2) ... (смещение файла N, номер N)

1 голос
/ 28 марта 2012

Если вы создаете файл, то есть два других варианта:

  1. печатать каждое число в поле фиксированной ширины, достаточном для удержания наибольшего числа (например, «% 5d»), затем fseek(somefile,(N-1)*6,SEEK_SET) для позиционирования на число N.

  2. Если файл не должен быть удобочитаемым для человека, вы можете fwrite() целые числа в виде двоичных данных вместо символов ASCII для файла и получить к ним доступ с помощью

    fseek(somefile,(N-1)*sizeof(int),SEEK_SET)
    fread(&variable,sizeof(int),1,somefile)
    
...