将二进制文件读入char *并转换为struct?

时间:2016-12-12 02:40:41

标签: c file-io struct

我在这里遇到了一个奇怪的情况。这是一项作业,作为转发,但我在char* fs中有一个10MB的文件struct block。我需要遍历它并将每512个字节分配给blockshort inuse有四个数据成员short inodeNumshort numPlacechar data[506]structs。二进制文件中的数据也是通过char* dataBlock写的。

我尝试从二进制文件读取512字节到mallocedchar* dataBlock到512字节大小),然后将struct block转换为我的memcpy。我尝试过类型转换,它会返回错误的值。我尝试了#include <stdio.h> #include <string.h> #include <stdlib.h> typedef struct { short testShort; int testInt; } testStruct; int main(int argc, char* argv[]) { testStruct temp; temp.testShort = 640; temp.testInt = 420; long fileLength; FILE* tempFile; tempFile = fopen(argv[1], "wb+"); fseek(tempFile, 0, SEEK_END); fileLength = ftell(tempFile); rewind(tempFile); char *buffer = (char *)malloc(sizeof(char) * 6); fwrite(&temp, sizeof(temp), 1, tempFile); fread(buffer, sizeof(char), 6, tempFile); fclose(tempFile); temp2 = (testStruct *)buffer; printf("%s\n", buffer); printf("%d\n", temp2->testShort); return 0; } 以及位移和按位数学。

我试图制作另一个程序来复制这个过程。

bottom: 0;

2 个答案:

答案 0 :(得分:1)

char *buffer = (char *)malloc(sizeof(char) * 6);
fread(buffer, sizeof(char), 6, tempFile);

如评论中所述,您应该使用sizeof(testStruct)而不是6,因为编译器可以填充结构,因此大小可以是8

您无需创建字符缓冲区并将其强制转换为testStruct。您可以使用引用并直接读取数据。示例:

testStruct temp2;
fread(&temp2, sizeof(testStruct), 1, tempFile);

在阅读文件之前还要添加rewind。在此示例中,您似乎不需要文件大小,因此您可以跳过该部分:

int main(int argc, char* argv[])
{
    if (argc < 2)
    {
        printf("error\n");  
        return 0;   
    }

    testStruct temp = { 640, 420 };

    FILE* tempFile;
    tempFile = fopen(argv[1], "wb+");

    fwrite(&temp, sizeof(temp), 1, tempFile);

    rewind(tempFile);
    testStruct temp2;
    fread(&temp2, sizeof(testStruct), 1, tempFile);
    fclose(tempFile);

    printf("%d\n", temp2.testShort);

    return 0;
}

答案 1 :(得分:-1)

您可能希望将rewind()函数(未在标准C中定义)的调用替换为fseek(tempFile, 0L, SEEK_SET)。这会move the current position到文件的开头,并在<stdio.h>中与您已经使用的文件访问函数一起声明。

顺便说一句,您通常无法使用ftell()来确定文件的大小,请参阅discussion in the CERT C Coding Standard为什么不能保证这样做。