为什么fstream.read工作而不是>>?
why fstream.read work and not >>?
我想知道为什么不能使用std::ifstream
的>>
运算符从二进制文件中读取无符号int。
#include <fstream>
int main(int argc, char* argv[])
{
std::ifstream in(argv[1]);
if(in.fail())
return -1;
unsigned int atom_size = 0;
in.read(reinterpret_cast<char*>(&atom_size), 4);
in >> atom_size;
return 0;
}
当我使用in.read
时,我会得到我想要的值,但当我使用>>
运算符时,我的atom_size变量不会改变。为什么?
显然您正在读取一个二进制文件。read
命令将请求的字节数从文件中复制到您提供的指针所指示的内存中。>>
运算符希望查找要转换为整数的ASCII文本。这两种操作根本不一样。
将二进制数据作为字符读取与将数据作为整数读取之间存在差异。例如,数字5为00000101。字符'5'为00110101。
>>
运算符正在读取个字符,因此当它看到00110101时,它假设这是5的字符。如果您尝试读取int
,那么>>
将正确地将其转换为00000101,并将该值存储在int中。但是,如果字符是例如像a
这样的字母,它与有效的int不对应,则>>
将静默失败(它不会崩溃,但会返回false
)。
例如,在二进制文件中,数字5可能存储为00000101,但>>
认为应该将其读取为字符(即ENQ字符)。这无法转换为int,因此in >> atom_size;
行将静默失败。实际上,它返回一个可以转换为bool
的istream&
,这样您就可以检查它是否失败,如下所示:
if(!(in >> atom_size)) {
cout << "Failed to read into atom_size" << endl;
}
相关文章:
- 在fstream期间忽略空行
- EASTL矢量<向量<int>>连续的
- 使用fstream对txt文件中的数字进行循环
- 为什么 fstream 在打开带有格式的文件时会导致分段错误?
- 无法打开 fstream C++文件,即使它与 .cpp 位于同一位置
- 使 std::fstream 写入文件末尾,但从头开始读取
- 为什么当我在 std::string 中打开文件名的 fstream 时出现"no matching function"错误?
- 自定义 std::fstream,std::filebuf 的溢出和下溢函数未为每个字符调用
- 如何修复函数中的 fstream 文件输入以将正确的信息存储在结构数组中?
- fstream / ifstream / ofstream 对象如何转换为布尔值
- 使用命令的未定义引用<fstream>
- 如何检查文件是否已存在于 fstream C++中
- 如何正确使用 fstream 并在 char 数组中传递数据?
- 如何使用 fstream 的 .get 字符串?
- 使用 fstream 库并在屏幕上打印的文件有问题?
- Windows std::fstream 修改文件后打开()?
- 如何删除文件中的数字,通过 c++ fstream 的
- std::fstream 在 MSVC 和 G++ 上使用 UTF-8 的不同行为
- C++ 错误检查 fstream open() 命令和一般字符串流错误处理
- 在istream_iterator中使用后的 C++ FSTREAM obj 回滚