C++ 将数据写入C+中的内存+;
我想在void*数据中混合使用int、char和real。 我使用一个文件指针来运行数据块。 现在我的问题是,由于数据类型是void,我必须在写入integer和char以写入字符串时将其类型转换为int。 在进行类型转换时,我使用了以下示例代码:C++ 将数据写入C+中的内存+;,c++,C++,我想在void*数据中混合使用int、char和real。 我使用一个文件指针来运行数据块。 现在我的问题是,由于数据类型是void,我必须在写入integer和char以写入字符串时将其类型转换为int。 在进行类型转换时,我使用了以下示例代码: *((int *)data+0) = 14; //writing int *((int *)data+4) = 5; //writing int, left a space of 4 bytes for 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);
cout您正在用以下内容编写第二个:
*((int *)data+4) = 5; // offset = 4
并通过以下方式阅读:
cout<<*((int *)data+3); // offset = 3
使用类或结构
在这里,指针算法误导了你。当您将4
添加到int*
时,实际上您添加了四次sizeof int
*((int*)数据+4)=5;//书写第四整数
*((int *)data+4) = 5; // writing 4th int
cout<<*((int *)data+3); // but reading third one
cout如果您的数据有一个固定的布局,为什么不使用一个struct
呢
struct MemoryLayout {
int _first;
int _second;
char _c1;
char _c2;
};
?编辑以纠正MSalters指出的错误
除了其他人提到的打字错误(data+3
而不是data+4
),您还需要更改,例如
*((int *)data+4)
到
由于将4
添加到int*
不会将4
添加到地址,因此会将4*sizeof(int)
添加到地址中
如果需要写入的偏移量不是sizeof(int)
(比如7)的倍数,则需要:
*(int *)((char *)data+7)
出于这个原因,最好从data
achar*
开始,这样您就可以说
*(int *)(data+7)
如果您真的想使用这样的代码,请确保已在编译器中禁用严格别名。因为您正在破坏严格的别名规则。更好的方法是使用库(如用于写入/读取二进制数据)。@让我想想,如果数据指针是字符类(如char或uint8\t),那么只要成员不重叠,它就不会破坏别名规则。@edA-qamort-ora-y请阅读问题。数据是void*
@Let\u Me\u Be,我知道,这就是为什么我说我们是为了指示一个比关闭别名规则更容易的选项。-1,将4
添加到void*
也不起作用。(因为sizeof(void)
是非法的)。正确:*(静态(数据)+1)
@MSalters:是的,你说得对。我已相应地编辑了我的答案。
*(int *)((char *)data+7)
*(int *)(data+7)
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);