我想在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);
我的代码编写方式是否正确?由于数据无效,我对此表示怀疑。
答案 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);