用C++将数据写入内存
Writing data to memory in C++
我想在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);
- 在C++中打印指向不同基元数据类型的指针的内存地址
- 如何在 malloc 内存中初始化非 POD 数据
- 如何使用 MPI 的远程内存访问 (RMA) 功能并行化数据聚合?
- 为什么字符串的 move() 会改变内存中底层数据的位置?
- C++,您能否设计一种数据结构,将指针保存在连续内存中并且不会使它们失效?
- 存储在哪个内存段(代码/数据段)类(员工)中?
- 基于浅树的数据结构的内存分配器,用于频繁分配和解除分配
- 获取 R 数据帧的内存地址
- 将数据存储在内存中以供以后访问
- 整数数据如何以位为单位存储在内存中?不是右对齐吗?
- 数据在内存 c++ 中丢失
- 我可以使用哪种数据结构来释放连续内存中的内存?
- 使用 delete [] 运算符取消分配类中数据成员的内存
- 为什么 std::set 容器使用的内存比其数据大小多得多?
- 如果一个变量在它之前释放了另一个(相同的数据类型)变量,如何将其分配给内存?
- 内存映射C++中的流数据
- 如何返回定义良好的内存部分?例如来自图像数据的像素的颜色值
- C++来自课堂的内存数据?
- Libjpeg将图像写入内存数据
- 将内存数据PTR映射到qt输入字段