0

所以我有一个程序,它获取一个文件并逐个字符地读取并打印字符和十六进制等价物。`

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

int main(){
FILE *labFile;
char buf;

labFile = fopen("lab1.dat", "r");
if (labFile == NULL) perror("Error opening file\n");

   while( (buf = fgetc(labFile) ) != EOF){
        if(("%x", buf)< 16){
            printf("%c 0%x\n", buf, buf);
        }
        else
            printf("%c %x\n", buf, buf);
   }
   fclose(labFile);
   return 0;
}

` 除一件事外,该程序按我需要的方式运行。我需要程序在顶部输出十六进制数字,然后在数字正下方输出字符,这个过程需要水平继续。

任何帮助将不胜感激!

4

2 回答 2

1

您应该首先将字符输出为十六进制,然后保存每个已打印的读入字符,直到屏幕上的列用完。然后,您可以移动到下一行,并打印出保存在十六进制输出下的字符。

您可以简化逻辑以将十六进制输出格式化为单个打印语句。

打印出字符时,您需要有一个计划来表示不可打印的字符。在下面的示例程序中,我们通过打印两个连续的点来处理它。

void print_chars (unsigned char *p, int num) {
   int i;
   for (i = 0; i < num; ++i) {
      printf("%s%c%s",
             isprint(p[i]) ? " "  : ".",
             isprint(p[i]) ? p[i] : '.',
             (i < num-1) ? " " : "\n");
   }
}

int main() {
   FILE *labFile;
   char buf;
   int count = 0;
   int num = COLUMNS/3;
   char printed[num];
   labFile = fopen("lab1.dat", "r");
   if (labFile == NULL) perror("Error opening file\n");
   while( (buf = fgetc(labFile) ) != EOF) {
      printf("%s%02x", count ? " " : "", buf);
      printed[count++] = buf;
      if (count == num) {
         count = 0;
         putchar('\n');
         print_chars(printed, num);
      }
   }
   fclose(labFile);
   if (count) {
      putchar('\n');
      print_chars(printed, count);
   }
   return 0;
}

列数除以 3,因为每个字符大约需要 3 列用于输出(2 个十六进制字符和一个空格)。检索列数取决于系统,但如果您愿意,可以插入 80 个。

于 2013-09-04T01:16:52.333 回答
0

你可以做这样的事情。假设您的行长度小于 100 个字符。不安全。

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

int main(){
FILE *labFile;
char buf[100];

labFile = fopen("lab1.dat", "r");
if (labFile == NULL) perror("Error opening file\n");

while(fgets(buf, 100, labFile)) {
    if(rindex(buf, '\n')) *rindex(buf, '\n') = 0;
    int i, n = strlen(buf);
    for(i = 0; i != n; i++) {
        printf("0%x ", buf[i]);
    }
    printf("\n");
    for(i = 0; i != n; i++) {
        printf("%c ", buf[i]);
    }
    printf("\n");
}
   fclose(labFile);
   return 0;
}
于 2013-09-04T00:30:05.837 回答