以下代码将输出相同的位置:
std::fstream fp;
fp.open("somefilename", std::ios::in | std::ios::out | std::ios::ate);
if (!fp.good()) exit(1);
fp.seekp(100, std::ios::beg);
std::cout << "p: " << fp.tellp() << " g: " << fp.tellg() << "\n";
fp.seekg(0, std::ios::beg);
std::cout << "p: " << fp.tellp() << " g: " << fp.tellg() << "\n";
因此,假设文件存在并且至少包含 100 个字节,则输出将是
p: 100 g: 100
p: 0 g: 0
我的问题是,为什么在 API 中坚持使用两个指针,而实际上它们是相同的? 我知道继承会“降低”虚拟方法,但我认为这有点令人困惑,因为很容易犯错误并相信有两个单独的指针,一个用于读取(获取),一个用于写入(放置)不是的。
是因为某些操作系统和/或硬件设备支持两个单独的指针吗?
欢迎任何反馈:-)
std::fstream
既充当输入流又充当输出流。你可以写这样的代码:
void f(std::ofstream& out) {
out.seekp(whatever);
}
void g(std::ifstream& out) {
out.seekg(whatever);
}
void q(std::fstream& str) {
f(str);
g(str);
}
为了使其发挥作用,
std::fstream
必须同时提供seekg
和seekp
。
两个函数都操作同一个指针,因为操作系统不一定区分读取位置和写入位置。当流处理非文件资源(例如字符串)时,实现可以处理不同的读取和写入位置,而无需复杂的操作。