C ++ Как читать в объектах с заданным смещением? - PullRequest
7 голосов
/ 26 июня 2009

Теперь у меня есть файл с большим количеством данных. И я знаю, что необходимые мне данные начинаются с позиции (long) x и имеют заданный размер sizeof (y) Как я могу получить эти данные?

Ответы [ 3 ]

11 голосов
/ 26 июня 2009

Используйте метод seek:

ifstream strm;
strm.open ( ... );
strm.seekg (x);
strm.read (buffer, y);
3 голосов
/ 26 июня 2009

Вы должны использовать fseek (), чтобы изменить «текущую позицию» в файле на желаемое смещение. Итак, если «f» - это ваша переменная FILE *, а offset - это смещение, то вот как должен выглядеть вызов (по модулю моей утечки памяти):

fseek(f, offset, SEEK_SET);
2 голосов
/ 26 июня 2009

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

Например, для следующего файла данных "foo.dat":

one two three

Следующий код напечатает весь текст после первых четырех байтов с использованием подхода mmap () :

#include <sys/mman.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>

#include <iostream>

int main()
{
  int result = -1;

  int const fd = open("foo.dat", O_RDONLY);
  struct stat s;

  if (fd != -1 && fstat(fd, &s) == 0)
  {
    void * const addr = mmap(0, s.st_size, PROT_READ, MAP_PRIVATE, fd, 0);
    if (addr != MAP_FAILED)
    {
       char const * const text = static_cast<char *>(addr);

       // Print all text after the first 4 bytes.
       std::cout << text + 4 << std::endl;
       munmap(addr, s.st_size);
       result = 0;
    }

    close(fd);
  }

  return result;
}

Вы даже можете использовать этот подход для прямой записи в файл (не забывайте msync () при необходимости).

Библиотеки, такие как Boost и ACE, обеспечивают удобную инкапсуляцию C ++ для mmap () (и эквивалентной функции Windows).

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

...