#include #include // TODO: Stop appending garbage at file end // TODO: Skip repeating lines #define BYTES 1024 #define BYTES_PER_LINE 20 void print_hex(unsigned char* buf, int byteno, int pos) { for (int i=0; i\nInline commands:\n\tpX - print position X\n\teX - edit position X\n\ts - save modified buffer\n\tq - quit\n", argv[0]); return -1; } FILE* f = fopen(argv[1], "r"); unsigned char buf[BYTES]; int byteno = fread(buf, 1, BYTES, f); print_hex(buf, byteno, 0); for (;;) { char cmd; int loc; scanf(" %c", &cmd); if (cmd == 'p' || cmd == 'P' || cmd == 'e' || cmd == 'E') scanf("%d", &loc); switch(cmd) { case 'p': case 'P': print_hex(buf + loc, BYTES_PER_LINE, loc); break; case 'e': case 'E': scanf("%hhx", buf + loc); break; case 's': case 'S': fclose(f); f = fopen(argv[1], "w"); if (!f) { perror("Error opening file for writing"); return -1; } fwrite(buf, 1, BYTES, f); fclose(f); break; case 'q': case 'Q': return 0; } } }