`fout.write( reinterpret_cast<const char*>(&e), sizeof(e) );` 为什么这里转换为 `const char*`?
`fout.write( reinterpret_cast<const char*>(&e), sizeof(e) );` why here casting into `const char*`?
代码
#include <iostream>
#include <fstream>
struct emp
{
char name[20];
int age;
};
int main()
{
emp e1={"Abhishek", 22},e2;
std::ofstream fout;
fout.open("vicky.dat", std::ios::out | std::ios::binary);
fout.write(reinterpret_cast<const char*>(&e1),24);
fout.close();
std::ifstream fin;
fin.open("vicky.dat", std::ios::in | std::ios::binary);
fin.read(reinterpret_cast<char*>(&e2),24);
fin.close();
std::cout<<e2.name<<" "<<e2.age<<"\n";
return 0;
}
为什么需要使用 write
和 read
函数的第一个参数执行 reinterpret_cast
?
为什么我们在 write
和 read
函数中分别将类型 emp
的地址转换为 const char*
和 char*
?
Why it is necessary to do reinterpret_cast
with 1st argument of write
and read
function ?
因为 write()
的第一个参数是 const char*
而 read()
的第一个参数是 char*
.
why we casting address of type emp
particularly to const char*
and char*
in write
and read
function respectively ?
在你的情况下,你可以将两者都转换为 char*
- 但是,在 write
的情况下,它不需要可变对象,因为它不会以任何方式修改它,如果您尝试转换为 char*
.
,您将无法 write
一个 const
对象
作品:
const emp e1 = {"Abhishek", 22};
fout.write(reinterpret_cast<const char*>(&e1), sizeof e1);
emp e2 = {"Foo", 23};
fout.write(reinterpret_cast<char*>(&e2), sizeof e2);
fout.write(reinterpret_cast<const char*>(&e2), sizeof e2);
甚至不编译:
const emp e1 = {"Abhishek", 22};
fout.write(reinterpret_cast<char*>(&e1), sizeof e1);
与问题无关但值得一提:
您已将 emp
的大小硬编码为 24
。不。使用 sizeof
获取实际大小。即使 int
在您当前的平台上是 4 个字节,如果您在不同的平台上编译它也可能不是。
与上述相关:如果您希望文件格式在不同平台上工作并处理 endianness,请使用固定宽度类型(如 uint32_t
用于 4 字节无符号整数) - 但是仍然使用 sizeof
,因为当您 add/remove 成员时手动计算尺寸很容易导致错误。
代码
#include <iostream>
#include <fstream>
struct emp
{
char name[20];
int age;
};
int main()
{
emp e1={"Abhishek", 22},e2;
std::ofstream fout;
fout.open("vicky.dat", std::ios::out | std::ios::binary);
fout.write(reinterpret_cast<const char*>(&e1),24);
fout.close();
std::ifstream fin;
fin.open("vicky.dat", std::ios::in | std::ios::binary);
fin.read(reinterpret_cast<char*>(&e2),24);
fin.close();
std::cout<<e2.name<<" "<<e2.age<<"\n";
return 0;
}
为什么需要使用 write
和 read
函数的第一个参数执行 reinterpret_cast
?
为什么我们在 write
和 read
函数中分别将类型 emp
的地址转换为 const char*
和 char*
?
Why it is necessary to do
reinterpret_cast
with 1st argument ofwrite
andread
function ?
因为 write()
的第一个参数是 const char*
而 read()
的第一个参数是 char*
.
why we casting address of type
emp
particularly toconst char*
andchar*
inwrite
andread
function respectively ?
在你的情况下,你可以将两者都转换为 char*
- 但是,在 write
的情况下,它不需要可变对象,因为它不会以任何方式修改它,如果您尝试转换为 char*
.
write
一个 const
对象
作品:
const emp e1 = {"Abhishek", 22};
fout.write(reinterpret_cast<const char*>(&e1), sizeof e1);
emp e2 = {"Foo", 23};
fout.write(reinterpret_cast<char*>(&e2), sizeof e2);
fout.write(reinterpret_cast<const char*>(&e2), sizeof e2);
甚至不编译:
const emp e1 = {"Abhishek", 22};
fout.write(reinterpret_cast<char*>(&e1), sizeof e1);
与问题无关但值得一提:
您已将 emp
的大小硬编码为 24
。不。使用 sizeof
获取实际大小。即使 int
在您当前的平台上是 4 个字节,如果您在不同的平台上编译它也可能不是。
与上述相关:如果您希望文件格式在不同平台上工作并处理 endianness,请使用固定宽度类型(如 uint32_t
用于 4 字节无符号整数) - 但是仍然使用 sizeof
,因为当您 add/remove 成员时手动计算尺寸很容易导致错误。