2012-04-05 5 views
1

어떻게 fread()이 사용되는지 혼란 스럽습니다. 다음은 cplusplus.comfread() 이후 메모리 버퍼에 액세스

/* fread example: read a complete file */ 
#include <stdio.h> 
#include <stdlib.h> 

int main() { 
    FILE * pFile; 
    long lSize; 
    char * buffer; 
    size_t result; 

    pFile = fopen ("myfile.bin" , "rb"); 
    if (pFile==NULL) {fputs ("File error",stderr); exit (1);} 

    // obtain file size: 
    fseek (pFile , 0 , SEEK_END); 
    lSize = ftell (pFile); 
    rewind (pFile); 

    // allocate memory to contain the whole file: 
    buffer = (char*) malloc (sizeof(char)*lSize); 
    if (buffer == NULL) {fputs ("Memory error",stderr); exit (2);} 

    // copy the file into the buffer: 
    result = fread (buffer,1,lSize,pFile); 
    if (result != lSize) {fputs ("Reading error",stderr); exit (3);} 

    /* the whole file is now loaded in the memory buffer. */ 

    // terminate 
    fclose (pFile); 
    free (buffer); 
    return 0; 
} 

에서 예제의 내가 아직 fclose()를 사용하지 않는 것이 가정 해 봅시다이다. buffer을 배열로 처리하고 buffer[i]과 같은 요소에 액세스 할 수 있습니까? 아니면 다른 것을해야합니까?

답변

3

물론 fread으로 전화 할 때 실제로 데이터가 버퍼 내에 복사됩니다. 안전하게 파일을 닫고 버퍼 자체로 원하는대로 할 수 있습니다.

원본 파일과 수정하여 버퍼에 액세스 할 수 있는지 묻는 경우 쓰기 모드로 열고 fwrite을 사용하여 파일을 다시 작성해야합니다.

당신은 예를 들어 2 부동 소수점 숫자가 이진 파일, 1 개 INT와 16 문자열이있는 경우 쉽게 구조체

struct MyData 
{ 
    float f1; 
    float f2; 
    int i1; 
    char string[16]; 
}; 

를 정의하고 직접 읽을 수 있습니다

struct MyData buffer; 
fread(&buffer, 1, sizeof(struct MyData), file); 
.. buffer.f1 .. 
+0

이진 파일을 읽을 때 각 요소의 유형은 무엇입니까? 나는이 경우에 그들은 모두'char's라는 느낌을 가지고 있습니다. 그들은 모두 같은 유형이어야합니까? 왜냐하면 나는 두 배의 값과 몇개의 16 진 값을 가지고 있기 때문이다. 귀하의 답변에 감사드립니다. –

+0

바이너리 파일에 대한 좋은 점은, 문제가없는 정확한 레이아웃을 알고 있다면 파일 내에서 바이너리 데이터의 레이아웃이 동일한 구조체를 정의 할 수 있으며 (엔디안이 맞다면) 직접 데이터를 가질 수 있다는 것입니다 사용할 준비가되었습니다. 내 편집을 확인하십시오. – Jack