바이너리 파일 입출력에 관하여...
글쓴이: linux777 / 작성시간: 토, 2004/03/06 - 3:50오후
#include <stdio.h> #define MAKE_BIN_VERSION "1.1" #define ROM_BASE 0x00000000 int main(int argc, char* argv[]) { char cdata; FILE *filei1,*filei2,*fileo; unsigned long ldata,posi,filesize1,filesize2; unsigned long my_initrd_start, initrd_start, initrd_size, initrd_start_ram; if (argc <3 ) { printf("usage: make_bin <Image> <initrd> <glued binary>\n"); return -1; } printf("\nmake_bin version %s\n\n", MAKE_BIN_VERSION); fileo = fopen(argv[3],"wb"); if (!fileo) { puts("ouput file creation failed"); return -1; } filei1 = fopen(argv[1],"rb"); if (!filei1) { puts("Image file not found"); return -1; } filei2=fopen( argv[2],"rb"); if (!filei2) { puts("intrd file not found"); return -1; } fseek(filei1,0,SEEK_END); filesize1 = ftell(filei1); fseek(filei1,0,SEEK_SET); printf("file %s size=%ld\n",argv[1],filesize1); fseek(filei2,0,SEEK_END); filesize2 = ftell(filei2); fseek(filei2,0,SEEK_SET); printf("file %s size=%ld\n",argv[2],filesize2); initrd_size = filesize2; initrd_start = my_initrd_start=filesize1; initrd_start_ram = 0xc1000000-initrd_size; /* place at end of RAM */ /* First Instruction */ fread(&ldata,sizeof(ldata),1,filei1); fwrite(&ldata,sizeof(ldata),1,fileo); ++++++++++++++++++++++++++++++++++++++++++++++ 의문이 가는 부분 입니다... ++++++++++++++++++++++++++++++++++++++++++++++ fread(&ldata,sizeof(ldata),1,filei1); /* linux kernel size */ fread(&ldata,sizeof(ldata),1,filei1); /* rootWit start address in ROM */ fread(&ldata,sizeof(ldata),1,filei1); /* rootWit size */ fread(&ldata,sizeof(ldata),1,filei1); /* rootWit start address in RAM */ ++++++++++++++++++++++++++++++++++++++++++++++ 여기까지가 이해 안 갑니다... ++++++++++++++++++++++++++++++++++++++++++++++ fwrite(&filesize1,sizeof(ldata),1,fileo); /* linux kernel size */ fwrite(&initrd_start_ram,sizeof(ldata),1,fileo); /* rootWit start address in ROM */ fwrite(&initrd_size,sizeof(ldata),1,fileo); /* rootWit size */ fwrite(&initrd_start,sizeof(ldata),1,fileo); /* rootWit start address in RAM */ initrd_start -= ROM_BASE; for(posi=20;posi<filesize1;posi++) { fread(&cdata,sizeof(cdata),1,filei1); fwrite(&cdata,sizeof(cdata),1,fileo); } fclose(filei1); cdata=0; for(posi=my_initrd_start;posi<initrd_start;posi++) { fwrite(&cdata,sizeof(cdata),1,fileo); } /* now we should start at a page aligned adress */ for(posi=0;posi<filesize2;posi++) { fread(&cdata,sizeof(cdata),1,filei2); fwrite(&cdata,sizeof(cdata),1,fileo); } fclose(filei2); fclose(fileo); initrd_start+=ROM_BASE; printf("initrd_start= 0x%08lx\n",initrd_start); printf("initrd_start_ram= 0x%08lx\n\n",initrd_start_ram); return 0; }
위의 프로그램에서 +++++++++++++로 둘러싸인 부분이 이해가
안 갑니다...
제가 이해하고 있는바는
double earning[10];
fread(earning, sizeof(double), 10, fp); 라면
fp의 파일로부터 10개의 더블형값을 earning에 읽어드리는것인데,
여기에서는 10개의 더블값을 읽어드리기 위해 double earning[10]; 을
지정해 놓았지만 위의 예에서는 배열도 지정하지 않은것 같은데요...
똑같은 문장 4개가 각각 다른의미로 쓰인다는것이 이해가 안가네요?
조금만 시간내 주셔서 자세히 설명해 주세요...
제가 파일 입출력은 많이 해봐서....
무리한 청일런지도 모르지만 그래도 여쭤봅니다...
Forums:
Re:..
파일 포인터를 이동시키기 위한 게 아닐까 싶네요.
그냥 이동할 오프셋 계산해서 seek 하는게 더 나은 방법이겠지만,
차후에 저 값들이 필요할 경우도 대비해서 놔둔게 아닐까 싶군요.
댓글 달기