문제

이제 데이터가 많은 파일이 있습니다. 그리고 필요한 데이터가 위치 (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 ++ 캡슐화를 제공합니다.

이 접근법은 아마도 작은 파일의 경우 과잉 일 수 있지만 큰 파일의 경우 큰 승리가 될 수 있습니다. 평소와 같이 코드를 프로파일 링하여 어떤 접근 방식이 가장 좋은지 결정하십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top