我试图从一个命令行参数中读取一次解析16个字节的文件。我将字节存储在一个unsigned char数组中。然后,我试图以HEX格式打印元素,然后,如果它们是可打印字符,我正在打印它们,如果不是,我打印一个点“。”我也想打印每个新行上文件起始字节的偏移量,但是我希望在开始处理之前让剩下的部分工作。我遇到的问题是我正在阅读的文件不是打印文件,因此我认为我没有正确执行。我开始使用fread()
,但我想我可能需要使用fseek()
,但我不确定。如果有人能指出我的方向是正确的还是告诉我如果我做错了什么,我会很感激。在C中一次读取一个文件16字节0
代码:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
FILE *fp;
int i, j;
unsigned char buffer[17];
fp = fopen(argv[1], "r");
while(!feof(fp))
{
while(fread(buffer, 16, 1, fp) !=0)
{
for(i=0; i < 16; i++)
{
printf("%X ", buffer[i]);
}
for(j = 0; j < 16; j++)
{
if(isprint(buffer[j]))
printf("%s", buffer[j]);
else
printf(".");
}
printf("\n");
}
}
fclose(fp);
return 0;
}
预期输出:
0001: 40 4F 28 37 0B B8 FF 9D 81 5E 2E 73 B5 CC 6A 70 @O(7.....^.s..jp
0010: 0F 30 9C 6E 7E F7 53 E0 C1 5E 9A 38 C5 02 F2 33 .0.n .S..^.8...3
编辑:固定的问题与建议。以文本模式打开文件而不是二进制文件。将读取模式更改为"rb"
,代码现在正常工作。
啊,好吧,我看到我出错的地方。修正它现在打印正确。现在我要开始处理文件偏移量。你知道这是否会用'fseek()'或'fread()'来完成吗? – bkedge 2014-10-16 20:07:55
@ wh33lybrdy使用fseek在文件中定位。您可以根据第二个参数指定从开始或结束的偏移量,例如SEEK_END。如果你有更多的问题,最好发布他们,而不是继续编辑这个问题,因为过了一段时间这个问题变得非常混乱。 – 2014-10-16 20:08:52