#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)로하면 일부만 출력됩니다.. 왜일까요..