C++ 我是否需要定义&燃气轮机&燃气轮机&引用;操作员将cin与Int32'一起使用;s

C++ 我是否需要定义&燃气轮机&燃气轮机&引用;操作员将cin与Int32'一起使用;s,c++,file-io,operator-overloading,ifstream,C++,File Io,Operator Overloading,Ifstream,我需要从文件中准确读取32位。我正在STL中使用ifstream。我可以直接说: int32 my_int; std::ifstream my_stream; my_stream.open("my_file.txt",std::ifstream::in); if (my_stream && !my_stream.eof()) my_stream >> my_int; …还是我需要以某种方式重写>>运算符才能使用int32?我没有看到此处列出的int32: i

我需要从文件中准确读取32位。我正在STL中使用ifstream。我可以直接说:

int32 my_int;
std::ifstream my_stream;

my_stream.open("my_file.txt",std::ifstream::in);
if (my_stream && !my_stream.eof())
   my_stream >> my_int;
…还是我需要以某种方式重写>>运算符才能使用int32?我没有看到此处列出的int32:
int32
将是一个
typedef
,在您的平台上,任何类型都是32位有符号整数。该基础类型肯定会为其重载
操作符>

更新


正如Billy在下面指出的,流被设计为读取文本并将其解析为重载数据类型。因此,在您的代码示例中,它将查找数字字符序列。因此,它不会从您的文件中读取32位。

int32
将是一个
typedef
,因为在您的平台上,任何类型都是32位有符号整数。该基础类型肯定会为其重载
操作符>

更新


正如Billy在下面指出的,流被设计为读取文本并将其解析为重载数据类型。因此,在您的代码示例中,它将查找数字字符序列。因此,它不会从文件中读取32位。

流提取操作符(
>
)执行格式化IO,而不是二进制IO。您需要改用
std::istream::read
。您还需要以
二进制文件的形式打开该文件。哦,检查
std::istream::eof
在代码中是多余的

int32 my_int;
std::ifstream my_stream;

my_stream.open("my_file.txt",std::ios::in | std::ios::binary);
if (my_stream)
{
    my_stream.read(reinterpret_cast<char*>(&my_int), sizeof(my_int));
}
//Be sure to check my_stream to see if the read succeeded.
int32 my\u int;
std::ifstream my_stream;
my_stream.open(“my_file.txt”,std::ios::in | std::ios::binary);
如果(我的_流)
{
my_stream.read(重新解释强制转换(&my_int)、sizeof(my_int));
}
//请务必检查我的_流以查看读取是否成功。

请注意,这样做将引入对代码的平台依赖性,因为整数中字节的顺序在不同的平台上是不同的。

流提取操作符(
>
)执行格式化IO,而不是二进制IO。您需要改用
std::istream::read
。您还需要以
二进制文件的形式打开该文件。哦,检查
std::istream::eof
在代码中是多余的

int32 my_int;
std::ifstream my_stream;

my_stream.open("my_file.txt",std::ios::in | std::ios::binary);
if (my_stream)
{
    my_stream.read(reinterpret_cast<char*>(&my_int), sizeof(my_int));
}
//Be sure to check my_stream to see if the read succeeded.
int32 my\u int;
std::ifstream my_stream;
my_stream.open(“my_file.txt”,std::ios::in | std::ios::binary);
如果(我的_流)
{
my_stream.read(重新解释强制转换(&my_int)、sizeof(my_int));
}
//请务必检查我的_流以查看读取是否成功。

请注意,这样做会引入对代码的平台依赖性,因为整数中字节的顺序在不同的平台上是不同的。

True,但是big-endian不是很快就要消亡了吗?我很久没见过solaris系统了…@Jason:ARM不是死了就是死了:)而且,大多数文件格式和网络协议都被指定为big-endian(出于某种原因)。哦,是的,我忘了ARM是big-endian。啊!幸好我的代码不会在任何智能手机上使用;o) 但最终,当您处理存储int数据的二进制文件时,您必须担心endianness,对吗?那么这不是给定的吗?@Jason:是的,但是如果你一个字符一个字符地写加载,那么你就可以在不同的平台上读取相同的文件而不会产生问题。也就是说,处于big-endian模式的ARM可以写入文件,而x86可以读取相同的文件。你选哪一个并不重要,只要你选一个就行。如果要移植到另一个平台,则需要在此处编写endian翻转代码。或者,你可以将数字存储为文本,然后忘记整个问题。是的,但是big endian不是很快就要死了吗?我很久没见过solaris系统了…@Jason:ARM不是死了就是死了:)而且,大多数文件格式和网络协议都被指定为big-endian(出于某种原因)。哦,是的,我忘了ARM是big-endian。啊!幸好我的代码不会在任何智能手机上使用;o) 但最终,当您处理存储int数据的二进制文件时,您必须担心endianness,对吗?那么这不是给定的吗?@Jason:是的,但是如果你一个字符一个字符地写加载,那么你就可以在不同的平台上读取相同的文件而不会产生问题。也就是说,处于big-endian模式的ARM可以写入文件,而x86可以读取相同的文件。你选哪一个并不重要,只要你选一个就行。如果要移植到另一个平台,则需要在此处编写endian翻转代码。或者,您可以将数字存储为文本,而忽略整个问题。