我试图在固定文件位置(256)从二进制文件到屏幕打印固定数量的字节(128)。但是,结果显示如下:
作为参考,我真的不知道二进制文件中有什么内容;但我怀疑它不是正方形。
代码在这里:
int main()
{
FILE *file;
char *buffer;
file = fopen ( "binaryfile.bin" , "rb" );
if (file==NULL)
{
fputs ("Couldn' open file",stderr);
exit (-1);
}
fseek (file , 0 , 256);
buffer = (char*) malloc (sizeof(char)*128);
fread (buffer,128,1,file);
fwrite (buffer , sizeof(char)*128, 1, stdout);
return 0;
}
这个程序是一个mcve,它显示了如何从二进制文件中读取128个字节,并将每个字节打印为2位十六进制值:
#include <stdio.h>
#include <stdlib.h>
int main() {
FILE *file;
char *buffer;
file = fopen("binaryfile.bin", "rb");
if (file == NULL) {
perror("Could not open file");
exit(1);
}
fseek(file, 256, SEEK_SET);
buffer = malloc(sizeof(char) * 128);
fread(buffer, sizeof(char), 128, file);
for (int index = 0; index < 128; index++) {
printf("%02X", ((unsigned int) buffer[index]) & 0x0FF);
if (index % 8 == 7) {
printf("\n");
}
else {
printf(" ");
}
}
printf("\n");
return 0;
}
示例输出
AD 0D 25 C8 74 AD D3 13
D5 00 62 EC CF 73 8E A4
61 2E 31 2F 70 ED D3 14
03 CC 06 B6 FB 77 FB ED
B4 0A 59 5F 50 00 61 59
D6 0B 21 F2 E6 1B 1A 07
DF 5E B8 32 17 D5 3E 29
0D 9E AE 47 D7 AF 86 4F
1E 75 6F EA C7 F7 A3 82
56 41 AA E8 02 42 91 D6
08 34 4F 63 40 9B 9C 06
0A 4E 65 30 90 7D 8A 4B
33 D1 50 9A 99 C5 F3 34
D9 A6 E0 2C 33 76 B3 DD
69 DF F9 30 8C 37 3A 51
9A 4F DB 81 81 F7 F5 F9
注意
该程序缺少一些错误检查,并没有释放分配的内存。此代码不应在生产环境中使用。
fseek (file , 0 , 256);
错了。 fseek
的第三个论点应该是SEEK_SET
,SEEK_CUR
或SEEK_END
之一;第二个是偏移量。要将文件指针设置为文件中的第256个字节,请使用:
fseek(file, 256, SEEK_SET);