바이너리 파일 입출력에 관하여...

linux777의 이미지

#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개가 각각 다른의미로 쓰인다는것이 이해가 안가네요?

조금만 시간내 주셔서 자세히 설명해 주세요...
제가 파일 입출력은 많이 해봐서....
무리한 청일런지도 모르지만 그래도 여쭤봅니다...

kslee80의 이미지

파일 포인터를 이동시키기 위한 게 아닐까 싶네요.
그냥 이동할 오프셋 계산해서 seek 하는게 더 나은 방법이겠지만,
차후에 저 값들이 필요할 경우도 대비해서 놔둔게 아닐까 싶군요.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.