用C++将数据写入内存

Writing data to memory in C++

本文关键字:内存 数据 C++      更新时间:2023-10-16

我想在void*数据中混合使用int、char和real。我正在使用一个文件指针来运行数据块。现在我的问题是,由于数据类型是void,所以在写integer时必须将其类型转换为int,在写字符串时必须将char类型转换为char。在打字时,我使用了以下示例代码:

*((int *)data+0) = 14;      //writing int
*((int *)data+4) = 5;       //writing int, left a space of 4 bytes for int
*((char *)data+8) = 'a';    //writing char
*((char *)data+9) = 'f';    //writing char

但是在读回数值时,它并没有给出正确的数值。

cout<<*((int *)data+0);
cout<<*((int *)data+3);
cout<<*((char *)data+8);

我的代码编写方式正确吗?我对此表示怀疑,因为数据是无效的。

*((int *)data+4) = 5; // writing 4th int
cout<<*((int *)data+3); // but reading third one

以防万一,((int*(data+4(指向第4个整数(即,给定int大小=4的第16个字节(,而不是第4个字节。也就是说,代码覆盖字节0-3、16-19、第8、第9。您的意思可能是:*(int *)( (char*)data + X )

编辑以更正MSchangers 指出的错误

除了其他人提到的打字错误(data+3而不是data+4(外,您还需要更改例如

*((int *)data+4)

*((int *)data+1)

因为将4添加到int *不会将4添加到地址,所以它添加了4 * sizeof (int)

如果你需要写入一个不是sizeof(int)(比如7(倍数的偏移量,你需要:

*(int *)((char *)data+7)

出于这个原因,最好先将data设为char *,这样你就可以说

*(int *)(data+7)

使用类或结构。

在这里,指针算法会误导你。当您将4添加到int *时,实际上是sizeof int的四倍。

如果你的数据有一个恒定的布局,为什么不直接使用struct,比如

struct MemoryLayout {
    int _first;
    int _second;
    char _c1;
    char _c2;
};

您正在用编写第二个

*((int *)data+4) = 5;    // offset = 4

并用读回

cout<<*((int *)data+3);  // offset = 3

此外,(int*)强制转换绑定到data,而不是data+4,因此您的4将按int的大小放大。

如果您真的想这样做(由于数据格式的差异,struct是不可能的(,您应该将data强制转换为char*,然后添加字节数以获得char偏移量,然后将强制转换为所需类型。

这将类似于:

*((int*)((char*)(data + 0)) = 14;    //writing int
*((int*)((char*)(data + 4)) = 5;     //writing int
*((char*)data + 8) = 'a';            //writing char
*((char*)data + 9) = 'f';            //writing char
int Data;
//char Data;
//float Data;
FILE *File = fopen("File.txt","wb");
fwrite((char *)&Data,sizeof(Data),1,File);
fclose(File);
File = fopen("File.txt","rb");
fread((char *)&Data,sizeof(Data),1,File);
fclose(File);

int DataInt1 = 200;
char DataChar1 = 'N';
FILE *File = fopen("File.txt","wb");
fwrite((char *)&DataInt1,sizeof(DataInt1),1,File);
fwrite((char *)&DataChar1,sizeof(DataChar1),1,File);
fclose(File);
int DataInt2 = 0;
char DataChar2 = 0;
File = fopen("File.txt","rb");
fread((char *)&DataInt2,sizeof(DataInt2),1,File);
fread((char *)&DataChar2,sizeof(DataChar2),1,File);
fclose(File);
printf("%d %d!n",DataInt2,DataChar2);