2017-04-13 6 views
0

FILE * (CImg)을 허용하는 라이브러리가 있습니다. 성능상의 이유로 디스크에 액세스하지 않고 메모리에 이미있는 데이터를 처리하려고합니다. 대상 플랫폼은 불행하게도 fmemopen 지원하지 않는 창 (및 funopen)메모리 내 FILE * (디스크 액세스 제외)

char* buf = new char[sz]; 

FILE *fp = fopen("C:\\test.dat", "wb"); 
int r = setvbuf(fp, buf, _IOFBF, sz); 

r = fwrite(src_buf, 1, sz, fp);  // Here r contains right size 


fseek(fp, 0, SEEK_END); 
size_t sz2 = ftell(fp);    // sz2 contains right size as well 
rewind(fp); 

// Test (something like this actually is somewhere deep inside library) 
char* read_buf = new char[sz]; 
r = fread(read_buf, 1, sz, fp);  // Zero! 

최종 FREAD()는 아무것도 읽을 수 없습니다 ... 어떤 제안입니까?

+1

왜이 태그가 C++로 태그 되나요? 이것은 C와 비슷해 보입니다. – Dai

+0

메모리 매핑 파일을 사용할 가능성이 있습니까? – user3344003

+1

'fp'가 쓰기 전용으로 열렸습니다. – aschepler

답변

0

구체적인 경우에는 CImg 플러그인을 사용했습니다.

원래 질문의 샘플에서 - 적어도 MSVC 런타임은 기록 된 내용을 디스크 자체로 플러시합니다. 그래서

0

은 아마 당신은 (+ 쓰기 읽기)

fopen() function

추가하기 위해, 당신은 errno.h을 #include를하고 인쇄 할 수 있습니다 "WB"(쓰기 전용) 대신에 "+ WB"로 열려 있기 때문에 오류 코드 및 문자열

printf("errno: %d, error:'%s'\n", errno, strerror(errno)); 
+0

감사합니다. 이것은 우리에게 도움이되었지만 여전히 디스크에 데이터를 플러시하는 결과를 낳습니다. 아마도 우리의 경우 RAM 드라이브가 해결책이 될 것입니다. – Victor

+0

@Victor는 snprintf의 C 런타임 소스를 살펴 봅니다. IIRC, 메모리 버퍼를 통해 가짜 FILE을 수행합니다. 더 나은 참조를 찾을 수있는 Windows 상자가 없습니다. –

0

당신은 POSIX-2008 기능 fmemopen()open_memstream() 사용할 수 있습니다) (fmemopen에 대한 대체 유효한되지 않습니다 : 첫 번째는 메모리 데이터 라이브러리에 유용하게 통과 될 것를, 두 번째는 점점 유용합니다 라이브러리의 데이터를 실제 데이터 크기에 맞게 open_memstream()에 의해 할당 될 메모리 버퍼에 저장합니다.