用C ++将数据写入内存

时间:2011-10-17 07:47:38

标签: c++

我想在void *数据中混合使用int,char,real。 我正在使用文件指针来运行数据块。 现在我的问题是,由于数据类型是无效的,我必须将它转换为int,同时写入整数和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);

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

6 个答案:

答案 0 :(得分:2)

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

以防万一,((int *)data + 4)指向第4个整数(即int size = 4的第16个字节),而不是第4个字节。也就是说,您的代码将覆盖字节0-3,然后是16-19,然后是第8,然后是第9。你的意思是:*(int *)( (char*)data + X )

答案 1 :(得分:1)

已编辑以更正MSalters指出的错误

除了其他人提到的拼写错误(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)

答案 2 :(得分:0)

你正在编写第二个:

*((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

答案 3 :(得分:0)

使用类或结构。

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

答案 4 :(得分:0)

如果您的数据具有恒定的布局,为什么不使用struct,例如

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

答案 5 :(得分:0)

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);