2009-06-26 6 views
4

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

+0

@shevron, эти объекты сохраняются на диске? Или просто файл, содержащий некоторые данные, которые вы хотите прочитать? –

ответ

8

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

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

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

fseek(f, offset, SEEK_SET); 
+0

добавьте профайл для части «как я могу получить эти данные». – Tom

2

Помимо обычных методов поиска и чтения, упомянутых выше, вы также можете сопоставить файл в своем пространстве процесса, используя что-то вроде 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).

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

 Смежные вопросы

  • Нет связанных вопросов^_^