이제 많은 데이터가 들어있는 파일이 있습니다. 그리고 필요한 데이터가 위치 (long) x에서 시작하고 주어진 크기 (sizeof (y))를가집니다. 이 데이터를 얻으려면 어떻게해야합니까?C++ 주어진 오프셋을 가진 객체를 읽는 방법?
답변
사용 seek
방법 :
ifstream strm;
strm.open (...);
strm.seekg (x);
strm.read (buffer, y);
파일의 "현재 위치"를 원하는 오프셋으로 변경하려면 fseek()를 사용해야합니다.
fseek(f, offset, SEEK_SET);
"어떻게이 데이터를 얻을 수 있습니까?"부분에 fread를 추가하십시오. – Tom
"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++ 캡슐화를 제공합니다.
이 방법은 작은 파일에서는 과도하게 사용되지만 대용량 파일에서는 큰 도움이 될 수 있습니다. 평소와 같이 가장 적합한 접근 방식을 결정하기 위해 코드를 프로파일하십시오.
@shevron 이러한 개체는 디스크에 유지됩니까? 또는 읽고 싶은 일부 데이터가 포함 된 파일입니까? –