当 std::fstream 都移动一个指针时,为什么它们还存在eekp/seekg?

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

以下代码将输出相同的位置:

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 中坚持使用两个指针,而实际上它们是相同的? 我知道继承会“降低”虚拟方法,但我认为这有点令人困惑,因为很容易犯错误并相信有两个单独的指针,一个用于读取(获取),一个用于写入(放置)不是的。

是因为某些操作系统和/或硬件设备支持两个单独的指针吗?

欢迎任何反馈:-)

c++ c++-standard-library
1个回答
1
投票

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

两个函数都操作同一个指针,因为操作系统不一定区分读取位置和写入位置。当流处理非文件资源(例如字符串)时,实现可以处理不同的读取和写入位置,而无需复杂的操作。

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