#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define SIZE 255
void hexDump (char *desc, void *addr, int len) {
int i;
unsigned char buffLine[17];
unsigned char *pc = (unsigned char*)addr;
if (desc != NULL){
printf ("%s:\n", desc);
}
for (i = 0; i < len; i++) {
if ((i % 16) == 0) {
if (i != 0)
printf (" %s\n", buffLine);
// if (buffLine[i]== '\0') break;
if (pc[i] == 0x00) exit(0);
// Prints the ADDRESS
printf (" %07x ", i);
}
// Prints the HEXCODES that represent each chars.
printf ("%02x", pc[i]);
if ((i % 2) == 1)
printf (" ");
if ((pc[i] < 0x20) || (pc[i] > 0x7e)){
buffLine[i % 16] = '.';
}
else{
buffLine[i % 16] = pc[i];
}
buffLine[(i % 16) + 1] = '\0'; //Clears the next array buffLine
}
while ((i % 16) != 0) {
printf (" ");
i++;
}
printf (" %s\n", buffLine);
}
//----------------------------------------------
int main()
{
FILE *ptr_file;
char buff[SIZE];
ptr_file =fopen("input.txt","r");
if (!ptr_file){
printf("returning 1");
return 1;
}
memset(buff, '\0', sizeof( buff) );
fgets(buff,SIZE, ptr_file);
hexDump ("buff", &buff, sizeof (buff));
fclose(ptr_file);
return 0;
}
//*/
抱歉,我是C的新手,所以现在它有点乱,我一直在删除零件并制作临时代码等等...... 所以无论如何,这通过从input.txt读取字符并通过在右侧打印十六进制表示和Acii表示来输出它。对于形成不可打印字符的字节,打印'。'字符(点/句点字符,即十六进制值2E)。:
0003540: 0504 0675 6e73 6967 6e65 6420 6368 6172 ...unsigned char
0003550: 0008 0107 0000 0131 0675 6e73 6967 6e65 .......1.unsigne
但我的节目没有打印任何超出“新行”的内容。在文中。 例如: 在我的input.txt中,我有:
This is line 1 so this will be longer than usual
line 2 is this
this is the last line
阅读我的程序后,它只输出如下:
0000000 5468 6973 2069 7320 6c69 6e65 2031 2073 This is line 1 s
0000010 6f20 7468 6973 2077 696c 6c20 6265 206c o this will be l
0000020 6f6e 6765 7220 7468 616e 2075 7375 616c onger than usual
0000030 0a00 0000 0000 0000 0000 0000 0000 0000 ................
但由于某种原因,它不会打印并剔除第二,第三行......
答案 0 :(得分:1)
您只需拨打fgets
一次。 fgets
从文件中读取一行,当它耗尽SIZE
字符限制时,当它到达文件末尾或遇到换行符时停止。所以这种行为是可以预期的。
数据的长度通常小于字符数限制,但是您打印所有SIZE
字符,这会给你零。
如果要处理所有行,则应在循环中调用fgets
并在返回NULL
时将其分解。您还应该将strlen(buf)
作为长度参数而不是sizeof(buf)
,这将为您提供通常超长的SIZE
。
十六进制转储程序的目的是使任何文件的数据可见。您使用fgets
和char
,它们应该用于文本文件。 (例如,我不确定fgets
在遇到空字节时会做什么。)
因此,最好使用字节,即unsigned char
,并使用fread
逐块读取它们。如果您将块大小设置为16的倍数,这将帮助您格式化输出。所以:
for (;;) {
unsigned char buf[SIZE];
size_t n = fread(buf, 1, SIZE, f);
if (n > 0) dump(buf, n);
if (n < SIZE) break;
}
答案 1 :(得分:1)
您需要使用&#34; rb&#34;以二进制模式打开文件。不是&#34; r&#34;
然后使用fread()从文件读取,方法是从文件中读取块或读取整个文件。
答案 2 :(得分:1)
您应该使用fread()
来读取文件,并将其放入循环中(直到它返回0),以便它读取整个文件。如果您使用的是Windows,请确保使用“rb”(二进制模式)打开文件,而在Unix上则无关紧要。
最后一个建议是使用isascii()
或其姐妹函数之一,而不是手动检查“可印刷性”。请参阅http://linux.die.net/man/3/isalnum。