2013-09-25 4 views
2

У меня есть файл, содержащий данные (подписанных номеров), расположенных следующим образом:Вертикальный Ищи в файл для передачи данных с помощью C

291 
-1332 
    912 
    915 
-1347 
    196 
    1110 
    -997 
    120 
    1017 
    -775 
    -443 
    985 
    13 
    -690 
    369 
    673 
    -826 
    -14 
    891 
    -546...(thousands of lines) 

Я хочу использовать функцию, которая будет двигать указатель файла определенное количество линия для ex.1100

в настоящее время я использую следующий код, чтобы пропустить и перейти к конкретной строке/номер

if (offset>0)//offset is number of destination line 
{ 
while(fscanf(f,"%d",&buffer)!=EOF) //f is file pointer ;Buffer is int variable 
    { 
    i++; 
    if(i==offset) 
      break; 
    } 

} 

Я хочу использовать код лучше, чем это, как этот код занимает больше времени, а, s offset, Любые идеи для реализации этого в простой форме (и для более короткого времени)?

ответ

1

Если все ваши номера (например) шесть символов в длину, и у вас есть один символ \n новой строки в конце каждой строки, вы можете получить номер строки n (нулевой основе) по fseeking к n * 7. Строка 0 находится со смещением 0, строка 1 со смещением 7, строка 2 со смещением 14 и т. Д.

Аналогично, линия 1100 (1101st линия), может быть получен на что-то вроде:

if (fseek (f, 7700L, SEEK_SET) != 0) { 
    // something went wrong. 
} 
if (fscanf (f, "%d", &buffer) != 1) { 
    // something else went wrong. 
} 

Это будет работать для любой фиксированной ширины линии, вы просто должны регулировать коэффициент умножения, основанный на ширину линии и окончание строки (например, DOS-кодирование может содержать два символов, \r\n).

Конечно, вы можете обнаружить, что полезно просто прочитать весь файл в целочисленный массив в памяти (в зависимости от как много тысяч есть), так что случайный доступ к данным становится Ослепительно быстро - что это потому, что там нет причина вернуться к файлу для любых данных после начальной загрузки.

+0

+1 спасибо. Я попробую с ним сейчас. –

+0

сделал это успешно спасибо :) –

1

У вас есть несколько вариантов. Если вы должны сохранить текстовый файл чисел, так как каждая строка переменной длины, вы можете:

  • ММАП (карта памяти) содержимое файла и индексировать номеров строк ко массив. Для этого вам нужно сделать один проход файла и создать массив смещений файлов, где начинается каждая строка.
  • Перезапишите файл как двоичные данные (например, массив из int) - он более компактен и быстрее ищет, поскольку каждое целое число найдено в nth_int * sizeof (int). Вы платите штраф один раз в начале, чтобы перезаписать файл.
  • Многое зависит от вашей окружающей среды и случаев использования, и это то, где ваши лучшие правила оценки. Прежде всего, проверьте и оцените, стоит ли это.
+0

Я не думаю, что смогу это сделать Я работаю над процессором DSP –

+0

Какой смысл использовать DSP, если вы делаете так много операций ввода-вывода, что это замедляет вас? В идеале, вы должны получить то, что вам нужно для работы в памяти, чтобы вы использовали свой DSP 100%, нет? –