>  기사  >  백엔드 개발  >  바이너리 파일을 부호 없는 문자 벡터로 효율적으로 읽는 방법은 무엇입니까?

바이너리 파일을 부호 없는 문자 벡터로 효율적으로 읽는 방법은 무엇입니까?

Mary-Kate Olsen
Mary-Kate Olsen원래의
2024-10-30 08:00:03446검색

How to Read Binary Files into a Vector of Unsigned Chars Efficiently?

부호 없는 문자 벡터로 효율적인 바이너리 파일 읽기

바이너리 파일 읽기 방법

바이너리 파일을 부호 없는 문자 벡터(std::벡터)로 효율적으로 읽으려면 다음과 같은 여러 가지 방법을 사용할 수 있습니다.

방법 1:

<code class="cpp">std::vector<BYTE> readFile(const char* filename) {
  std::ifstream file(filename, std::ios::binary);
  std::streampos fileSize = file.tellg();
  std::vector<BYTE> fileData(fileSize);
  file.read((char*) &fileData[0], fileSize);
  return fileData;
}</code>

이 방법은 파일을 열고 file.seekg/file.tellg를 사용하여 크기를 결정합니다. 그런 다음 적절한 크기의 벡터를 할당하고 데이터를 읽습니다. 그러나 char*에 대한 명시적인 캐스트가 필요하므로 불편할 수 있습니다.

방법 2:

<code class="cpp">std::vector<BYTE> readFile(const char* filename) {
  std::ifstream file(filename, std::ios::binary);
  return std::vector<BYTE>((std::istreambuf_iterator<char>(file)),
                            std::istreambuf_iterator<char>());
}</code>

이 방법은 std::istreambuf_iterator를 활용하여 반복합니다. 파일의 문자를 생성하고 벡터를 구성하지만 벡터가 서명되지 않은 문자를 저장하더라도 char로 캐스팅해야 합니다.

방법 3:

<code class="cpp">std::vector<BYTE> readFile(const char* filename) {
  std::basic_ifstream<BYTE> file(filename, std::ios::binary);
  return std::vector<BYTE>((std::istreambuf_iterator<BYTE>(file)),
                            std::istreambuf_iterator<BYTE>());
}</code>

이 방법은 다음을 직접 사용합니다. 원하는 유형 BYTE가 있는 std::basic_ifstream. 캐스팅이 필요하지 않습니다.

비하인드 작업:

std::istreambuf_iterator를 사용할 때, 기본 작업에는 파일의 내부 버퍼에서 읽고 char 데이터를 원하는 유형(이 경우 BYTE)으로 변환하는 작업이 포함됩니다. 그러나 이러한 변환 프로세스로 인해 일부 성능 문제가 발생할 수 있습니다.

성능 최적화:

성능을 최적화하려면 다음을 고려하십시오.

  • std::basic_ifstream 직접 유형 처리를 위해.
  • 여러 크기 조정을 피하기 위해 읽기 전에 벡터의 용량을 예약합니다.
  • 특수 반복자와 함께 std::copy를 사용하여 파일에서 벡터로 데이터를 효율적으로 전송합니다.
  • 파일의 바이너리 모드가 활성화(std::ios::binary)되고 줄바꿈 건너뛰기가 비활성화(std::noskipws)되었는지 확인하세요. 이러한 설정은 영향을 미칠 수 있습니다. 바이너리 데이터 읽기.

위 내용은 바이너리 파일을 부호 없는 문자 벡터로 효율적으로 읽는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.