장치에 대한 읽기 및 쓰기는 섹터 정렬과 섹터 크기의 정수배 인 바이트 수로 이루어져야합니다.
섹터 크기에 대한 가정을하지 마십시오. 모든 장치의 섹터 크기를 쿼리하고 동적으로 작업해야합니다. 일반적인 크기는 하드 드라이브의 경우 512 개이고 광학 드라이브의 경우 2048 개입니다. 당신은 당신이 DeviceIoControl()
를 호출 할 수 있습니다 Windows에서 섹터 크기를 얻을 필요가있는 경우
FILE *file_pointer = fopen("/path/to/device", "rb");
size_t sector_size;
ioctl(fd, BLKSSZGET, §or_size);
setvbuf(file_pointer, NULL, _IOFBF, sector_size);
:
당신이 낭비 오버 헤드를 침해하지 않는 범위 내에서이 장치에 대한 바이트로 바이트를 읽을 수 있도록 기능을 원하는 경우
이 트릭을 시도
IOCTL_DISK_GET_DRIVE_GEOMETRY
.
Stdio는 검색을 s
으로 정렬하고 크기는 s
입니다. 또한 기본 stdio 구현이이 작업을 수행하지 않으면 posix_memalign()
또는 _aligned_malloc()
을 사용하여 자체 버퍼를 제공 할 수 있습니다.
편집 : 당신은 FILE *f;
으로, 섹터 크기 512 장치로 작업
코멘트에 혼란을 취소합니다. fseek()
은 오프셋 37입니다. f
의 위치는 업데이트되지만 장치는 검색되지 않습니다. 너 fread()
500 바이트. lseek()
은 오프셋 0으로 호출됩니다. 512 바이트는 f
의 버퍼로 읽혀집니다. 바이트 37 ~ 512는 사용자가 제공 한 버퍼에 복사됩니다. lseek()
이 512의 오프셋으로 호출됩니다. 512 바이트가 읽히고 나머지 463 바이트가 fread()
으로 전달 된 버퍼로 복사됩니다. 현재 fread()
의 단일 바이트 인 경우 기기를 두드리지 않고 기존 버퍼에서 f
으로 간단히 복사합니다.
이전 질문에 대한 답을 수락하면 시간을 보낸 사람이 보상을받을 수 있습니다. –