1、
#include <stdio.h> #include <ctype.h> int main(void) { int n; unsigned long count = 0; // count初始值为0, 为什么是unsigned long? unsigned char buf[16]; //字符数组为什么是unsigned? FILE *fp; char fname[FILENAME_MAX]; printf("filename: "); scanf("%s", fname); if((fp = fopen(fname, "rb")) == NULL) printf("aFile open failed. "); else { while((n = fread(buf, 1, 16, fp)) > 0) // while语句,fread函数的返回值为循环控制条件,fread函数的返回值为从fp流中读取的字符数,循环次数等于 //fp流中的总字符数除以每组个数16,如不能整除,则+ 1. { int i; printf("%081X ", count); // 使用占位为81的16进制数记录每一次循环 for(i = 0; i < n; i++) printf("%02X ", (unsigned)buf[i]); // 使用占位为2的16进制数显示每一次循环的每一个字符 if(n < 16) // 当n不够16时, 使用空格填充 for(i = n; i < 16; i++) printf(" "); for(i = 0; i < n; i++) // 判断是否为可打印字符,如果是可打印字符,则输出,否则输出. putchar(isprint(buf[i]) ? buf[i] : '.'); putchar(' '); count += 16; //十六进制记录循环次数 } fclose(fp); } return 0; }