【问题标题】:printing bytes read from binary file at a certain file position C [closed]在某个文件位置C打印从二进制文件读取的字节[关闭]
【发布时间】:2019-03-21 19:59:29
【问题描述】:

我正在尝试在固定文件位置 (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;
}

【问题讨论】:

  • 为什么您希望二进制文件中有可打印的字符?文件中没有正方形,只有在上下文中有意义的数字。您可以通过在循环中打印它们或使用文件转储实用程序来检查它们的值。一些文本编辑器也允许您以十六进制格式查看原始文件字节。
  • 这可能是垃圾,因为你得到随机控制字符和上半部分字符,这取决于你的终端字符集。你想要一个十六进制编辑器吗?
  • 您实际上非常奇怪地使用fwrite - 它从元素大小和元素数量获得单独的参数,但是您将两者相乘...(和sizeof (char) 总是 1)

标签: c io fopen fread


【解决方案1】:

fseek (file , 0 , 256); 是错误的。 fseek 的第三个参数应该是 SEEK_SETSEEK_CURSEEK_END 之一; second 是偏移量。要将文件指针设置为文件中的第 256 个字节,请使用:

fseek(file, 256, SEEK_SET);

【讨论】:

  • 这将如何使方块消失? :D
  • @AnttiHaapala 如果文件实际上是二进制文件,它可能不会。但现在 OP 的 fread 调用实际上会像他们想要的那样从位置 256 开始读取 128 个字节。
  • 没错,是的。
  • 另外,fread() 使用不当。应该是int n = fread(buffer,1,128,file);第二个参数是每个元素的大小;第三个是要读取的元素个数。那么n就是实际读取的字节数。
【解决方案2】:

这个程序是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

注意

该程序缺少一些错误检查并且没有释放分配的内存。此代码不应在生产环境中使用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-26
    • 2021-09-07
    • 1970-01-01
    • 2012-07-11
    • 1970-01-01
    • 1970-01-01
    • 2020-11-09
    • 2011-11-22
    相关资源
    最近更新 更多