将文件读入结构

问题描述 投票:4回答:6

我正在尝试将文件的内容读入结构。结构看起来像这样:

    typedef struct{
            unsigned char e_ident[EI_NIDENT] ;
            Elf32_Half e_type;
            Elf32_Half e_machine;
            Elf32_Word e_version;
            Elf32_Addr e_entry;
            Elf32_Off e_phoff;
            Elf32_Off e_shoff;
            Elf32_Word e_flags;
            Elf32_Half e_ehsize;
            Elf32_Half e_phentsize;
            Elf32_Half e_phnum;
            Elf32_Half e_shentsize;
            Elf32_Half e_shnum;
            Elf32_Half e_shstrndx;
    } Elf32_Ehdr;
extern Elf32_Ehdr elfH;

基本上是ELF头文件。因此,无论如何,我想将文件的内容加载到此结构中。

函数看起来像这样。

Elf32_Ehdr elfH;
int load(char* fname){
        FILE* file = fopen(fname,"r");

        if(NULL == file) return 0;

        fread(&elfH, 1, 52, file);

        fclose(file);
        return 1;
}

似乎无法正常工作。 elfH的内容与预期不符。可能是什么问题?我应该>

我正在尝试将文件的内容读入结构。结构看起来像这样:typedef struct {unsigned char e_ident [EI_NIDENT]; Elf32_Half e_type; ...

c struct fread
6个回答
1
投票

这是我用来从ELF可执行文件读取标头的代码。


0
投票

您必须在"b"的文件访问模式字符串("rb")中添加fopen才能进行二进制数据读取。您的硬编码elf标头大小也可能不是一个好主意,因为您的elf标头结构的大小可能不完全是62。sizeof(Elf32_Ehdr)可能是一种更好的方法...


0
投票

也许您的问题是文件中的数据没有以程序期望的相同的endianness写入。


0
投票

C对struct的内容如何在内存中打包和对齐作出有限的保证。 Elf32_Ehdr结构的元素是否实际上是连续的,这可能与编译器和平台有关。由于它们的大小都不同,所以我对此表示怀疑(如果您打印出sizeof(Elf32_Ehdr)并将其与标题的实际磁盘大小进行比较,则可能会看到差异)。


0
投票

正如dragosht指出的,如果您使用某种Windows计算机,则可能需要打开二进制文件。


0
投票

您拥有的代码向后读取,这会使if语句不正确。如果项已读取,则fread返回数字。如果向后提供size参数,则它将返回读取的字节数。因此,解决方案是给两个size参数以相反的顺序读取。

© www.soinside.com 2019 - 2024. All rights reserved.