Вопрос

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

Это было полезно?

Решение

Использовать seek метод:

ifstream strm;
strm.open ( ... );
strm.seekg (x);
strm.read (buffer, y);

Другие советы

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

fseek(f, offset, SEEK_SET);

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

Например, учитывая следующий файл данных «foo.dat»:

one two three

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

#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;
}

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top