본문 바로가기
코스웨어/13년 스마트컨트롤러

헥사뷰어_석주원

by 알 수 없는 사용자 2013. 5. 3.
728x90
반응형

#include <stdio.h>

#define MAX    512

void hexaview(unsigned char *RData, unsigned int iSize, int lines);

int main(int argc, char *argv[])
{
  FILE *fp;

  int count = 0;      // 문자수를 세는 변수
  int numOfChar = 0;    // 문자수가 512를 넘었을 경우 세어주는 변수
  unsigned char RData[MAX];  // 파일에서 읽어온 문자를 저장할 버퍼
  char ch;        // getc()로 문자를 받아올 변수

  if (argc != 2)
  {
    printf("< 입력형식 >\n");
    printf("fileviewer (filename)\n");
    exit(-1);
  }
  if ((fp = fopen(argv[1], "r")) == NULL)
  {
    printf("%s 파일을 찾을 수 없습니다.\n", argv[1]);
    exit(-1);
  }
  ch = fgetc(fp);
  // 문자수가 512를 넘는 경우
  //while ((ch = fgetc(fp)) != EOF)    // ch를 signed char로 선언해야 EOF 인식
  while (0 == feof(fp))
  {
    RData[count++] = ch;
    if (count == MAX)
    {
      hexaview(RData, sizeof(RData)/sizeof(RData[0]), numOfChar);
      // 버퍼크기만큼 출력하고 대기하는 부분
      printf("\nPress any key to continue...\n");
      getchar();
      //512개가 넘으면 numOfChar에 512를 저장하고 count는 0으로 초기화
      numOfChar += count;
      count = 0;
    }
    ch = fgetc(fp);
  }

  // 문자수가 512가 안되는 경우 출력 || 마지막 부분 출력
  if (0 != feof(fp) && count < MAX)
    hexaview(RData, --count, numOfChar);
  
  fclose(fp);

  printf("\n%s 파일은 %d개의 문자로 이루어져 있습니다.\n", argv[1], count+numOfChar);
  return 0;
}

void hexaview(unsigned char *RData, unsigned int iSize, int lines)
{
  unsigned char *ucP = RData;
  int iCnt, iLoop;

  printf("-------------------------------------"
      "------------------------------------\n");
  printf("ADDRESS\t\t\t   HEXA\t\t\t\t   ASCII\n");
  printf("\n\t ");
  for (iCnt = 0; iCnt < 16; iCnt++)
    printf("%02X ", iCnt);
  putchar('\n');
  printf("-------------------------------------"
      "------------------------------------\n");
  if(0 == iSize%16)
    iSize = iSize/16;
  else
    iSize = (iSize/16) + 1;
  
  for (iLoop = 0; iLoop < iSize; iLoop++)
  {
    // 행번호 출력
    printf("%08X ", lines);
    for (iCnt = 0; iCnt < 16; iCnt++)
    {
      printf("%02X ", *(ucP + iCnt));
    }
    for (iCnt = 0; iCnt < 16; iCnt++)
    {
      if (0 == *(ucP+iCnt))
        printf(".");
      else if (32 > *(ucP+iCnt))
        printf(".");
      else if (127 < *(ucP+iCnt))
        printf(".");
      else
        printf("%c", *(ucP + iCnt));
    }
    
    putchar('\n');
    ucP += iCnt;
    lines += iCnt;
  }
}

텍스트파일은 잘 출력되는데 실행파일이 다 출력안되네요
while문 종료조건을 (ch = getc(fp) ) == EOF로 하면
한줄만 출력되고
feof(fp)로하면 일부만 출력됩니다.. 왜일까요..



728x90