2012-07-03 2 views
-3
내가 lBuffer의 내용을 인쇄 할 수있는 MFC 응용 프로그램에서 fwrite을 사용하고

는 C++ 코드를 다음과 같이 : 파일 abuffer.bin의 내용이 왜에 fwrite를 사용하여 쓸 수 없습니다()

PvBuffer *lBuffer = NULL; 

// Retrieve next buffer  
PvResult lResult = lStream.RetrieveBuffer(&lBuffer, &lOperationResult, 1000); 
if (lResult.IsOK()) 
{ 
    FILE *fp = fopen("C:\\Users\\acm45\\Desktop\\abuffer.bin", "wb"); 
    fwrite(lBuffer, 1, 10075968, fp); 
    fclose(fp); 
} 

어떤 생각 항상 IResult 성공을 반환해도 항상 비어 있습니까?
파일은 프로그램을 실행할 때 항상 만들어 지지만 비어 있으며 크기는 0KB입니다.

는 업데이트 : 내가 이런 짓을 디버깅 할 수
:

FILE *fp = fopen("C:\\Users\\acm45\\Desktop\\abuffer.bin", "wb"); 
if (fp) { 
    fwrite(lBuffer, 1,10075968, fp); 
    fclose(fp); 
} else { 
    printf("error opening file"); 
} 

하지 인쇄 "오류 파일을 여는"한 출력 만, 여전히 파일이 비어 있습니다. 지금 무엇을해야합니까? 이 일을

+0

탭과 공백이 섞이지 않도록하십시오. 항상 공간을 더 잘 사용하십시오. –

+1

else 분기에'perror' 호출을 추가하십시오 : else {perror ("fopen"); }' – unkulunkulu

+0

정확히 내가 뭘 제안했지만 내 대답 투표 : P –

답변

1

난 당신이 몇 가지 정의되지 않은 동작이 발생하는 것 같아요.

에 fwrite의 매뉴얼 페이지 말한다 :

size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);

함수에 fwrite()는 데이터의 nmemb 요소를 기록, 스트림 stream이 가리키는에 각각의 크기가에서 그들을 획득, 긴 바이트 위치 ptr에 의해 주어진.

그러나 전화

lStream.RetrieveBuffer(&lBuffer, &lOperationResult, 1000); 

날은 각각 바이트 길이와 10,075,968 요소가없는 추측 할 수 있습니다.

기타 : 버퍼가 POD 요소의 컬렉션입니까? 그렇지 않은 경우 정의되지 않은 동작의 또 다른 이유입니다. fwrite은 POD 유형에만 사용됩니다.

일반적으로이면 C++ 스트림을 사용하는 것이 좋습니다.


추록에 fwrite 여기

size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);

size는 단일 요소의 크기를 의미를 설명한다.

nmemb은 이러한 요소의 수입니다. 예를 들어

... 
struct Foobar { 
    int frob; 
}; 

int main() { 
    ... 
    Foobar thingies[5]; 
    fwrite (thingies, sizeof(Foobar), 5, some_file); 
} 

보다 일반적인 방법이있다 :

Foobar thingies[5]; 
    const size_t nm = sizeof(thingies)/sizeof(Foobar); 
    fwrite (thingies, sizeof(Foobar), nm, some_file); 

이 읽기 ​​"배열의 크기, 그 배열의 요소의 수와 동일한 단일 요소의 크기로 나눈 ".

그러나 이것은 포인터가 아니라 배열에서만 작동한다는 점에 유의하십시오!

Foobar *thingies = new Foobar[5]; 
    const size_t nm = sizeof(thingies)/sizeof(Foobar); 
    fwrite (thingies, sizeof(Foobar), nm, some_file); 
    // THIS IS WRONG. sizeof(thingies) now equals to the 
    // size of a pointer! 
+0

을 해결했습니다. 실제로 sizeof (lBuffer)에 의해 발견 된 4 개의 요소가 있고 각 요소는 2 바이트 길이이므로 다음과 같이 알고 있습니다. fwrite (lBuffer, 2, 4, fp); 그리고 그 인쇄가 올바르게! – gpuguy

+0

@gpuguy 난 그냥 궁금해서 : ** 어디서 골랐어 요 10075968 ** ???? –

+0

카메라 출력 : 2448 X 2058 픽셀 X 2 바이트 각각 (실제 12 비트) – gpuguy

-1

시도 :

FILE *fp = fopen("C:\\Users\\acm45\\Desktop\\abuffer.bin", "wb"); 
if (fp) { 
    fwrite(lBuffer, 1, 10075968, fp); 
    fclose(fp); 
} else { 
    perror("fopen"); 
} 
+0

나는 그것을 해냈다. 업데이트 – gpuguy

-1

버퍼를 올바르게 검색하는지 확인하십시오. 해당 클래스에서 사용 가능한 경우 함수를 사용하여 버퍼 크기를 가져 와서 해당 상수 대신 전달하십시오.

+1

'sizeof (lBuffer)'는 아마도 4 또는 8과 같습니다. – unkulunkulu

+0

sizeof (LBuffer)를 사용하면 4가됩니다. – gpuguy

+1

@gpuguy 포인터의 크기 (32/64 비트)입니다. 고마워요, –

관련 문제