【发布时间】:2021-06-11 08:15:57
【问题描述】:
以下代码将输出相同的位置:
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 中使用两个指针,而实际上它们是相同的? 我知道继承会“降低”虚拟方法,但我认为这有点令人困惑,因为很容易犯错误,并且相信有两个单独的指针,一个用于读取(get),一个用于写入(put)不是。
是不是因为某些操作系统和/或硬件设备支持两个独立的指针?
为任何反馈干杯:-)
【问题讨论】:
-
我的猜测是,basic_istream 和 basic_ostream 都作用于 basic_ios(或 ios_base)中的同一个数据成员。我对你的惊讶表示同情,这似乎也违反了 Liskov 原则。 en.cppreference.com/w/cpp/io/basic_fstream
-
@dratenik 我认为该链接没有解释“为什么”,它只是以官方方式说“它是”
-
@AlessandroTeruzzi 加上它提供了一个流(stringstream)示例,其中 put 和 get 位置是独立的。
-
@dratenik 我并不是说这个链接没有任何价值,确实让我很好奇为什么 stringstream 表现不同
-
@AlessandroTeruzzi 可能是底层操作系统的限制,我不认为任何主流操作系统(和/或 POSIX)都为文件描述符维护单独的读写位置。