2016-06-14 3 views
0

프로그램을 읽을 때 비트 맵을보고 있습니다. 문제는 내가 메인에 모든 것을 썼고 코드를 함수에 퍼뜨릴 필요가 있다는 것이다. 나는 표준 구조를 사용하여 fread를 사용하여 정보를 읽고있다. 그러나 나는 어떻게 든 함수를 떠난 후에 정보에 접근 할 수 없다. 그래서 포인터를 통해 구조를 시도했지만 fread는 그렇게 할 수 없습니다. 난 그 fread 포인터를 통해 할 수 있도록 설계되지 않은 읽었습니다. 그러나 나는 그것을 확인할 수 없다. 그리고 그것은 내 질문이다. 포인터를 통해 어떻게합니까? 그리고 왜 내 첫 시도가 기능 밖에서 작동하지 않습니까?함수 내의 구조체에 대한 포인터와 포인터

void odczyt_pliku_bmp(struct FileHeader fheader, struct MapHeader mheader, char *nazwa) { 
    FILE *fp1; 
    fp1 =fopen(nazwa,"rb"); 

    if(fp1) 
    { 
     fread(&fheader.sygnatura,2,1,fp1); 
     //... 


     printf("%d\n",fheader.sygnatura);//Checking. Everything seems right there 

    } 
    else 
    { 
     printf("Error"); 
    } 
    fclose(fp1); 
} 

그리고 주 :

int main() { 
    struct FileHeader fheader; 
    struct MapHeader mheader; 

    char nazwapliku, *wczyt_nazwa =&nazwapliku; 
    printf("Podaj nazwe pliku bitmapy: "); 
    scanf("%s",wczyt_nazwa); 

    odczyt_pliku_bmp(fheader, mheader, wczyt_nazwa); 
    printf("%d\n",fheader.sygnatura);// And there is random trash 

    return 0; 
} 

또 다른 포인터 사용해보십시오 :

void odczyt_pliku_bmp(struct FileHeader *fheader, struct MapHeader *mheader, char *nazwa) { 
    FILE *fp1; 
    fp1 =fopen(nazwa,"rb"); 

    if(fp1) 
    { 
     fread(fheader->sygnatura,2,1,fp1); 
     //... 


     printf("%d\n",fheader->sygnatura); 

    } 
    else 
    { 
     printf("Error"); 
    } 
    fclose(fp1); 
} 

초 방법 다시 주요 :

int main() { 
    struct FileHeader fheader; 
    struct MapHeader mheader; 

    char nazwapliku, *wczyt_nazwa =&nazwapliku; 
    printf("Podaj nazwe pliku bitmapy: "); 
    scanf("%s",wczyt_nazwa); 

    odczyt_pliku_bmp(&fheader, &mheader, wczyt_nazwa); 
    printf("%d\n",fheader.sygnatura); 

    return 0; 
} 
+2

폴란드어를 코드로 사용하지 않으면 도움이 될 것입니다. – Everettss

+0

'fread'는 주어진 스트림에서 배열로 데이터를 읽습니다. 그러나 코드에서 'fread'에 대한 첫 번째 인수는 구조체입니다. 패딩 문제로 인해 문제가 발생합니다. 보다 나은 접근법은 파일 헤더를'unsigned char'의 배열로 읽는 것입니다. – mw215

+0

[this] (http://stackoverflow.com/questions/37779302/fread-into-struct-reads-data-incorrectly/37780151)에서 도움이 될 수 있습니다. – mw215

답변

0

fread는 buffe의 주소가 필요합니다 아르 자형. 따라서 두 번째 시도에서 fheader->sygnatura의 주소를 전달하십시오.

fread(&fheader->sygnatura,2,1,fp1); 
+0

감사합니다. 모든 것이 현재 의도대로 작동합니다. – Aghero

관련 문제