C ++ 주어진 오프셋이있는 객체에서 읽는 방법은 무엇입니까?
-
20-08-2019 - |
문제
이제 데이터가 많은 파일이 있습니다. 그리고 필요한 데이터가 위치 (Long) X에서 시작하고 주어진 크기 크기가 있습니다 (Y)이 데이터를 어떻게 얻을 수 있습니까?
해결책
사용 seek
방법:
ifstream strm;
strm.open ( ... );
strm.seekg (x);
strm.read (buffer, y);
다른 팁
FSEEK ()를 사용하여 파일의 "현재 위치"를 원하는 오프셋으로 변경해야합니다. 따라서 "F"가 파일* 변수이고 오프셋 인 경우 오프셋 인 경우 호출이 어떻게 보이는지 (Modulo My Leaky Memory) :
fseek(f, offset, SEEK_SET);
위에서 언급 한 일반적인 탐색 및 읽기 기술 외에도 파일을 다음과 같은 것을 사용하여 프로세스 공간에 매핑 할 수도 있습니다. mmap () 데이터에 직접 액세스하십시오.
예를 들어 다음 데이터 파일 "foo.dat"가 주어지면 :
one two three
다음 코드는 처음 4 바이트를 사용한 후 모든 텍스트를 인쇄합니다. 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와 같은 라이브러리는 MMAP () (및 동등한 Windows 함수)에 대한 멋진 C ++ 캡슐화를 제공합니다.
이 접근법은 아마도 작은 파일의 경우 과잉 일 수 있지만 큰 파일의 경우 큰 승리가 될 수 있습니다. 평소와 같이 코드를 프로파일 링하여 어떤 접근 방식이 가장 좋은지 결정하십시오.
제휴하지 않습니다 StackOverflow