2009-06-26 5 views
4

이제 많은 데이터가 들어있는 파일이 있습니다. 그리고 필요한 데이터가 위치 (long) x에서 시작하고 주어진 크기 (sizeof (y))를가집니다. 이 데이터를 얻으려면 어떻게해야합니까?C++ 주어진 오프셋을 가진 객체를 읽는 방법?

+0

@shevron 이러한 개체는 디스크에 유지됩니까? 또는 읽고 싶은 일부 데이터가 포함 된 파일입니까? –

답변

8

사용 seek 방법 :

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

파일의 "현재 위치"를 원하는 오프셋으로 변경하려면 fseek()를 사용해야합니다.

fseek(f, offset, SEEK_SET); 
+0

"어떻게이 데이터를 얻을 수 있습니까?"부분에 fread를 추가하십시오. – Tom

2

"F"는 당신의 파일 * 변수를하고 오프셋 오프셋 (offset)를 가지는 경우에 그래서,이 호출이 (내 새는 메모리 모듈로)과 같이하는 방법입니다 위에서 언급 한 일반적인 검색 및 읽기 기술 외에도 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; 
} 

: 다음 코드는 mmap() 기반 접근 방식을 사용하여 첫 번째 4 바이트 후 모든 텍스트를 인쇄 할

one two three 

다음 데이터 파일 "foo.dat"주어진 예를 들어

, 이 방법을 사용하여 파일에 직접 쓸 수도 있습니다 (필요한 경우 msync() 기억하십시오).

Boost 및 ACE와 같은 라이브러리는 mmap() 및 이와 동등한 Windows 기능에 대해 멋진 C++ 캡슐화를 제공합니다.

이 방법은 작은 파일에서는 과도하게 사용되지만 대용량 파일에서는 큰 도움이 될 수 있습니다. 평소와 같이 가장 적합한 접근 방식을 결정하기 위해 코드를 프로파일하십시오.