2017-12-10 3 views
1

파일의 시작 부분부터 32 비트 부호없는 오프셋을 가진 파일 형식 (TIFF)을 읽었습니다.32 비트 부호없는 오프셋으로 검색

불행하게도 fseek과의 프로토 타입은, 내가 오프셋 특정 파일에 갈 것이 일반적인 방법이며, 그래서 오프셋

int fseek (FILE * stream, long int offset, int origin); 

이 서명됩니다. 이 상황을 어떻게 처리해야합니까? 검색을 위해 다른 기능을 사용해야합니까?

+0

어떤 OS를 사용하십니까? 32 비트 아키텍처를 사용하고 있습니까? – melpomene

+0

@melpomene이 코드는 32 비트 및 64 비트 아키텍처에서 작동해야하며 다른 컴퓨터와 운영 체제에서 실행될 수 있습니다. –

+0

2 또는 4GB를 초과하는 TIFF 파일은 일반적이지 않습니다. 당신의 CRT는 오랫동안 긴 논쟁을하는 대안을 가지고 있습니다, 당신은 그것의 문서를 봐야 할 것입니다. –

답변

0

당신은 The GNU C lib - Setting the File Position of a Descriptor

이 기능은 lseek의 기능과 유사에서

int fd = fileno (stream); 

노트와 lseek64() (man page)

#define _LARGEFILE64_SOURCE  /* See feature_test_macros(7) */ 
    #include <sys/types.h> 
    #include <unistd.h> 

    off64_t lseek64(int fd, off64_t offset, int whence); 

를 사용하려고 할 수 있습니다. 차이점은 offset 매개 변수가 off_t 대신 off64_t 유형이므로 32 비트 시스템에서 2^31 바이트보다 크고 2^63 바이트보다 큰 파일을 주소 지정하는 것이 가능하다는 것입니다. 파일 설명자 filedes는 open64를 사용하여 열어야합니다. 그렇지 않으면 off64_t에서 가능한 큰 오프셋은 작은 파일 모드에서 설명자와 함께 오류를 발생시킵니다.

32 비트 컴퓨터에서 소스 파일을 _FILE_OFFSET_BITS == 64로 컴파일하면이 함수는 실제로 lseek라는 이름으로 사용 가능하므로 32 비트 인터페이스를 투명하게 대체합니다. Streams and File Descriptors 스트림 파일 기술자의 관점에서 구현되기 때문에

에서 약 fdstream

는, 당신은 스트림에서 파일 기술자를 추출하고 파일 기술자에 직접적으로 낮은 수준의 작업을 수행 할 수 있습니다. 또한 처음에는 연결을 파일 설명자로 연 다음 해당 파일 설명 자와 연결된 스트림을 만들 수도 있습니다.

+1

'fseeko'가'fseek'의 대체품으로 더 적합하지 않겠습니까? 'lseek64'는'FILE *'에서 작동하지 않습니다. – melpomene

+0

'lseek64'는'fd'를 사용 합니다만, 대답의 맨 윗부분에는'FILE *','int fd = fileno (stream);'([fileno] ( –

+1

'FILE' 파일의 기본 파일 설명자를 사용하는 것은 stdio를 혼동하여 데이터를 손상시키는 좋은 방법 인 것처럼 들립니다. – melpomene

0

이 질문을 더 깊이 연구하고 다른 의견과 답변 (고맙습니다)을 고려한 후 가장 간단한 방법은 오프셋이 2147483647 바이트보다 큰 경우 두 번 탐색하는 것입니다. 이를 통해 오프셋을 uint32_t으로 유지하고 fseek을 계속 사용할 수 있습니다. 위치 결정 코드는 다음과 그러므로 :

// note: error handling code omitted 
uint32_t offset = ... (whatever it is) 
if(offset > 2147483647){ 
    fseek(file, 2147483647, SEEK_SET); 
    fseek(file, (long int)(offset - 2147483647), SEEK_CUR); 
} else { 
    fseek(file, (long int) offset, SEEK_SET); 
} 

64 비트 형식을 사용하는 데 문제가 코드 (무엇보다도) 32 비트 아키텍처에서 실행 될 수 있다는 점이다. 구조 fpos_t을 사용하여 임의로 큰 오프셋을 관리하는 기능이있는 fsetpos이 있지만 복잡한 점이 많습니다. fsetpos이 실제로는 큰 크기의 오프셋을 사용했다면 이해할 수 있지만, 가능한 가장 큰 오프셋이 uint32_t라는 것을 알고 있기 때문에 이중 탐색이 필요를 충족시킵니다.

이 솔루션을 사용하면 모든 TIFF 파일을 32 비트 시스템에서 처리 할 수 ​​있습니다. PixInsight와 같은 상용 프로그램을 고려한다면이 점의 장점이 분명합니다. PixInsight는 32 비트 시스템에서 실행될 때 2147483648 바이트보다 작은 TIFF 파일 만 처리 할 수 ​​있습니다. 전체 크기의 TIFF 파일을 처리하려면 사용자는 64 비트 컴퓨터에서 64 비트 버전의 PixInsight를 사용해야합니다. 이는 PixInsight 프로그래머가 내부적으로 오프셋을 처리하기 위해 64 비트 유형을 사용했기 때문일 수 있습니다.내 솔루션은 32 비트 형식 만 사용하므로 32 비트 시스템에서 전체 크기의 TIFF 파일을 처리 할 수 ​​있습니다 (기본 운영 체제가 큰 파일을 처리 할 수있는 경우).

관련 문제