Какой самый эффективный способ прочитать большой текстовый файл в обратном направлении? - PullRequest
3 голосов
/ 15 июля 2010

Каков самый эффективный способ чтения большого текстового файла в обратном порядке, строка за строкой, используя Windows API функции?Например, если файл:

line 1
...
line 108777
line 108778

, вывод должен быть:

line 108778
line 108777
...
line 1

Я хочу написать программу на C для этого.Вам не нужно писать код (но если вы хотите, это здорово), мне просто интересно, как это сделать, имея в виду, что файлы большие и что я хочу, чтобы программа работала настолько быстро, насколько это возможно.

Кроме того, меня интересует, какие функции Windows API использовать.

Ответы [ 5 ]

3 голосов
/ 15 июля 2010

Более умным решением является открытие файла, установка смещения файла равным (конец файла - размер буфера) и чтение (размер буфера) байтов, вы можете анализировать данные в буфере спереди назад, чтобы найти новые строкии делай что хочешь и так далее.

2 голосов
/ 15 июля 2010

Одним из методов является использование контейнера смещений файлов в начале каждой строки. После анализа файла обработайте контейнер в обратном порядке. См fgetc, fgets и fseek.

2 голосов
/ 15 июля 2010

Карта памяти файла. Он будет автоматически буферизован для вас - просто прочитайте его, как если бы это была память, начиная с хвоста и ища CRs / LFs / CRLFs.

2 голосов
/ 15 июля 2010

Файлы с отображением в памяти потерпят неудачу (или, по крайней мере, станут очень хитрыми), если файл больше доступного адресного пространства.Вместо этого попробуйте это:

input = input file
block_prefix = unique temporary file
block_index = 0

while (!eof (input))
{
   line = input.readline ();
   push line onto a stack

   if (stack > 100 entries) // doesn't have to be 100
   {
      output = block_prefix + block_index++

      while (stack has entries)
      {
        pop line off stack
        write to output
      }
   }
}

if (stack has entries)
{
  output = block_prefix + block_index++

  while (stack has entries)
  {
    pop line off stack
    write to output
  }
}

output = output file

while (block_index)
{
   read entire contents of block file (block_prefix + --block_index)
   write contents to output
   delete block file
}
2 голосов
/ 15 июля 2010

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

Взгляните на отображенные в память файлы , некоторые преимущества которых обсуждаются здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...