프로그램/C/C++/OOC

File Hexa Viewer : 고수준 파일 입출력 사용, C

와이즈캣 2010. 11. 9. 16:29

#include <stdio.h>
#include <stdlib.h>

#define   LEN  16

int main(int iParam, char *cpParam[])
{  int   iCnt;
  FILE   *stFile;
  char  cBuf;
  char  caStr[LEN+1]="";

  if(2 != iParam)
  {  fprintf(stdout, "파일 이름을 쓰세요\n");
    return 0;
  }

  stFile = fopen(cpParam[1], "rb");
  if(0 == stFile)
  {  fprintf(stdout, "[%s]파일을 찾을 수 없습니다\n"
            , cpParam[1]);
    return 0;
  }

  printf(  "┌────────┬───────────────────────────────────────────────┬────────────────┐\n");
  printf(  "│        │                  HEXA   CODE                  │  ASCII  CODE   │\n");
  printf(  "│  ADDR  ├───────────────────────────────────────────────┴────────────────┤\n");
  printf(  "│        │00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 0123456789ABCDEF│\n");
  printf(  "├────────┼────────────────────────────────────────────────────────────────┤\n");

  for(  cBuf = fgetc(stFile), iCnt = 0 ; EOF != cBuf ; cBuf = fgetc(stFile))
  {
    if(0 == (iCnt%LEN))
    {
      printf("│%08X│", iCnt/LEN);
    }
    printf("%02X ", (unsigned char)cBuf);

    if(31 < cBuf)
    {
      caStr[iCnt%LEN] = cBuf;
    }
    else
    {
      caStr[iCnt%LEN] = '.';
    }
    
    ++iCnt;
    if(0 == (iCnt%LEN))
    {
      printf("%s│\n", caStr);
    }

    
  }
  if(0 != (iCnt%LEN))
  {
    while(0 != (iCnt%LEN))
    {
      caStr[iCnt%LEN] = ' ';
      printf("   ");
      ++iCnt;
    }
    printf("%s│\n", caStr);
  }
  printf(  "└────────┴────────────────────────────────────────────────────────────────┘\n");

  fclose(stFile);
  return 0;
}
// By WiseCat, Ozsystem

// 실행 화면 : hexa hexa.c


// 소스 및 실행파일