2012-02-09 4 views
-1

A가 내 앞의 질문 (Reading an entire file in binary mode using C++)는 읽기와 이진 모드에서 JPG 파일을 읽은 후 C++

후속를 사용하여 바이너리 모드에서 전체 파일을 인쇄, 읽기 작업의 결과는 항상 4 바이트입니다. 코드는 다음과 같습니다.

FILE *fd = fopen("c:\\Temp\\img.jpg", "rb"); 
if(fd == NULL) { 
    cerr << "Error opening file\n"; 
    return; 
} 
fseek(fd, 0, SEEK_END); 
long fileSize = ftell(fd); 
int *stream = (int *)malloc(fileSize); 
fseek(fd, 0, SEEK_SET); 
int bytes_read = fread(stream, fileSize, 1, fd); 
printf("%x\n", *stream); 
fclose(fd); 

두 번째 마지막 printf 문은 항상 전체 파일 내용이 아닌 처음 4 바이트를 인쇄합니다. jpg 파일의 전체 내용을 인쇄하려면 어떻게해야합니까?

감사합니다.

+4

이것은 C++이 아닙니다. – Chad

+1

어떻게 포맷 하시겠습니까? 당신은'printf'에 16 진수로 하나의 정수를 표시하도록 요청했습니다. 'for' 루프에서 그렇게 할 수는 있지만 읽을 수는 없으므로 출력은 어떻게됩니까? – Useless

+0

음, 난 단지 16 진수로 파일의 전체 내용을 덤프하고 싶습니다 ... – pokiman

답변

2

C++에서 원하십니까? 이것은, 파일을 열 배열로 모든 콘텐츠를 판독하여 화면에 출력을 인쇄 :

#include <fstream> 
#include <vector> 
#include <iostream> 
#include <algorithm> 
using namespace std; 

int main() 
{ 
    ifstream in; 

    in.open("C:\\ISO\\ITCHOUT.txt", ios::in | ios::binary); 

    if(in.is_open()) 
    { 
     // get the starting position 
     streampos start = in.tellg(); 

     // go to the end 
     in.seekg(0, std::ios::end); 

     // get the ending position 
     streampos end = in.tellg(); 

     // go back to the start 
     in.seekg(0, std::ios::beg); 

     // create a vector to hold the data that 
     // is resized to the total size of the file  
     std::vector<char> contents; 
     contents.resize(static_cast<size_t>(end - start)); 

     // read it in 
     in.read(&contents[0], contents.size()); 

     // print it out (for clarity) 
     for(const char& c : contents) 
     { 
     cout << c; 
     }; 
    } 
} 
+0

어쨌든 (람다) C++ 11을 사용 했으므로 범위 기반 for 루프를 사용하도록 변경했습니다. 희망을 가지기를 바랍니다 :) –

+1

파일의 내용을 출력하려고한다면,'std :: cout << in.rdbuf()'는 메모리에 복사하는 것보다 쉽고 빠릅니다. 다음 인쇄. –

+0

@ R.MartinhoFernandes 전혀 아닙니다. – Chad

0

streamint (만약 1 할당 어레이의 첫 번째 요소)에 대한 포인터이다. *stream 포인터를 역 참조하고 처음으로 int을 제공합니다.

포인터가 배열이 아닙니다. 포인터는 버퍼가 아닙니다. 따라서이 배열은 가리키는 배열의 크기에 대한 정보를 전달하지 않습니다. 첫 번째 요소에 대한 포인터 만 제공하여 전체 배열을 인쇄 할 수있는 방법은 없습니다.

인쇄 방법은 무엇이든 포인터와 함께 크기 정보를 제공해야합니다.

C++의 표준 라이브러리에는 포인터 + 크기 패키지 인 std::vector이 있습니다. 나는 그것을 사용하는 것이 좋습니다 것입니다. 또는 배열을 직접 루프 할 수도 있습니다 (이는 크기 정보를 사용하는 것을 의미 함) 모든 요소를 ​​인쇄합니다.

파일의 크기가 sizeof(int)의 배수인지 확인하십시오!

0

다음과 같이하십시오. bytes_read()는 읽은 블록 수를 나타내며, 블록 크기는 파일 크기이므로 하나의 블록 만 읽을 수 있습니다.

전체 파일을 인쇄하려면 for 루프를 사용해야합니다. 포인터 주소 하나만 인쇄하고 있습니다.

  char *stream = (char *)malloc(fileSize); 
      fseek(fd, 0, SEEK_SET); 
      int bytes_read = fread(stream, fileSize, 1, fd); 
      for(int i=0; i<fileSize; i++){ 
        printf("%d ", stream[i]); 
      } 

콘솔에서 이진 데이터를 읽을 수 없으므로 문자를 숫자로 인쇄합니다. 나는 당신이 어떻게 데이터를 포맷하기를 원했는지 모른다.

이것은 샘플 견본을 의미합니다. Chad의 샘플을 사용하는 것이 좋습니다. 이것은 완전성을 위해서 단지 C/C++을 너무 많이 섞어서 사용하는 것보다 훨씬 나쁜 해결책입니다.

관련 문제