seekg是用来将输入位置偏移零吗?如果是这样,你为什么要这样做?

问题描述 投票:0回答:1

我发现以下代码将包含浮点数的文件读取为二进制:

#include <fstream>
#include <vector>

// ...

// Open the stream
std::ifstream is("input.dat");
// Determine the file length
is.seekg(0, std::ios_base::end);
std::size_t size=is.tellg();
is.seekg(0, std::ios_base::beg);
// Create a vector to store the data
std::vector<float> v(size/sizeof(float));
// Load the data
is.read((char*) &v[0], size);
// Close the file
is.close();

这个堆栈溢出答案

我有点不确定的是:

is.seekg(0, std::ios_base::beg);
这行,如果我理解正确的话,它应该将输入位置从0偏移
std::ios_base::beg
。但是
std::ios_base::beg
不是总是 0 因为它指的是流的开头吗?意思是
is.seekg(0)
is.seekg(std::ios_base::beg)
会达到相同的效果,但更简单。

c++ stream seekg
1个回答
0
投票

请参阅 seekg 的文档

了解具体信息,但这里本质上有两个函数签名。

istream& seekg (streampos pos);
这设置了一个绝对位置,从文件开头开始索引为 0。

istream& seekg (streamoff off, ios_base::seekdir way);
此另一个设置相对于流的三个选项之一的位置:(1) 开头,(2) 当前位置,或 (3) 结尾。

所以,

is.seekg(0)

is.seekg(0, std::ios_base::beg)
是等价的。如果您的示例可以编译,则可能会起作用,但只能通过 
std::ios_base::beg
 的值为 0 的运气。我认为这应该被视为一个错误,特别是对于某些对这些常量使用不同值的系统。

前者可能更简单,但后者更清晰。并且永远记住要善待那些必须维护你的代码的可怜虫,因为它可能就是你。

© www.soinside.com 2019 - 2024. All rights reserved.