从二进制文件读取结构,指针指向内存

时间:2019-05-15 12:59:29

标签: c++ c pointers structure fread

struct st {
        char *p;
        int len;
};

这是我需要与保存在

中的字符串一起写入二进制文件的结构

char *p

我应该用char数组数据编写一个二进制文件。写入二进制文件后。还应该能够从二进制文件中以相同的结构读取它。

我尝试使用FSEEK_END获取二进制文件大小,并根据文件大小进行读取,但是它没有保存字符串。请提出建议。任何帮助/建议/指针将不胜感激。

提前谢谢。

示例代码:

 struct st {
         char *p;
         int len; 
 };

 struct st varr;
 varr.len = 100;
 varr.p = new char[gen];
 strcpy(varr.p, "Hello World");

 FILE *p;
 p=fopen("address","wb");
 fwrite(&varr,sizeof(struct st),1,p);
 fclose(p); 

这将向我写入指向二进制文件的指针。但是我想在这里写整个字符串,但重点是,应该用一个fwrite完成。

5 个答案:

答案 0 :(得分:4)

将其写入二进制文件没有用。一个文本文件就足够了。

但是,如果这是您的家庭作业(或如此),我建议您按以下步骤进行:

  • 将长度写为整数;

  • 写入字符串的len个字节。这不包括终止null。

回读时:

  • 读取整数长度;

  • 分配此长度为加一个字节的内存

  • 将字符串读取到该内存中,并添加终止空值

以此长度和指向分配的内存的指针填充您的结构。


在您的注释中,您可以一步一步地迭代要读取和写入的内容。 使用当前的数据结构是不可能的,因为字符串将始终位于内存中的其他位置,并且fwrite只能写一个连续的内存块。

但是,您是否将数据结构更改为:

struct st{
    char p[128];
    int len;
};

然后您可以一口气读写,因为现在该结构是一个连续的内存块。但是现在字符串被限制为此128个字节(或您设置的任何大小)。

答案 1 :(得分:1)

我建议先保存strlen(p),然后再保存char * p指向的所有字符。如果尝试按原样写出该结构,则最终(在文件中)将获得地址的值,并转换为第一个字符。您不想保存第一个字符的地址,对吗?

答案 2 :(得分:0)

如果您非常担心没有两个fwrite,则可以使用零长度数组的包装器结构。

 struct st_wrap {
         int len; 
         char p[0];
 };

struct st_wrap *temp= malloc (sizeof (struct st_wrap ) + strlen(varr.p)+1);
temp->len = strlen(varr.p);

//Copy the data
strcpy(temp->p,varr.p);

//Then write it to file
fwrite(temp,sizeof(struct st_wrap)+strlen(varr.p),1,p);

答案 3 :(得分:0)

假设您已将长度和字符串写入二进制文件:

FILE* fp = fopen("file.bin", "wb");

/* writing */
st str = { .p = "foo", .len = 3 };
fwrite((char*)(&str.len), sizeof(str.len), sizeof(str.len), fp);
fwrite(str.p, str.len, str.len, fp);

您现在可以(在不同的上下文中)将文件中的内容读取到struct对象中

FILE* fp = fopen("file.bin", "rb");
st str;
/* read length */
fread((char*)&str.len, sizeof(str.len), sizeof(str.len), fp);
/* allocate enough space */
str.p = malloc((str.len + 1) * sizeof(char));
/* read string */
fread(str.p, str.len + 1, str.len + 1, fp);

在完成p后,请记住释放内存:

free(str.p);

答案 4 :(得分:0)

我尝试了很多方法,但是@kiran Biradar的回答对我有很大帮助。因此在这里显示工作代码。

WriteBinaryFile.cpp

    struct st_wrap {
            int len;
            int crc;
            char p[0]; 
    };


    int main ()
    {
            char p[100] = "Hello World";
            struct st_wrap *temp= (struct st_wrap*) malloc (sizeof (struct st_wrap ) + strlen(p)+1);
            temp->len = strlen(p);
            temp->crc = 400;
            strcpy(temp->p,p);
            cout << temp->p << endl;
            cout << temp->len << endl;
            cout << temp->crc << endl;

            FILE *p1;
            p1=fopen("binary.dat","wb");
            fwrite(temp,sizeof(struct st_wrap)+strlen(p),1,p1);
            fclose(p1);

    }

ReadBinaryFile.cpp

struct st_wrap {
        int len;
        int crc;
        char p[0];
};


int main ()
{
        struct st_wrap *vw;
        FILE *f=fopen("binary.dat","rb");
        fseek(f, 0, SEEK_END);
        long int filesize = ftell(f);
        fseek(f, 0, SEEK_SET);
        vw = (struct st_wrap*) malloc (filesize);
        fread(vw,filesize,1,f);
        cout << vw->len << endl;
        cout << vw->p << endl;
        cout << vw->crc << endl;
        return 0;
}