网站大量收购独家精品文档,联系QQ:2885784924

关于文件输入指针和输出指针的讨论.pdf

  1. 1、本文档共13页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
关于文件输入指针和输出指针的讨论

说明:本文来自于北京邮电大学软件学院2014 级学生与我的交流邮件。发表本 文前在征求作者意见时,该邮件作者要求匿名,因此本文中不出现作者名字。 摘要: 本文对于C++的fstream 类是否存在 “输入”文件指针与 “输出”文件指针给 出了详实的依据。 文章的结论如下: C++03 标准在“文件输入”和“文件输出”的背景下谈到“文件指针”,并没 有说明是否隐含了“文件输入指针”和 “文件输出指针”。 C++14 标准则将文件输入和文件输出下所进行的文件指针操作分开讨论,并单 独加了一条修改文件指针的描述。没有了输入或输出的背景,显然在fstream 中只能有一个文件指针。文件输入和输出操作都会影响这个文件指针。 注:我们说的C++的stream 类中所谓的“指针”,实际上是流 (比如文件、字符串)中的一个 位置标记,用整数表示,与C 语言中的 “FILE*”是不同的。在这里我们不纠结于术语叫法。 补充说明: 在C++03 标准之下,可以认为,fstream 中的 “文件输入指针”与 “文件输出 指针”是否为同一个指针,取决于具体实现; 在C++14 标准之下,则认为一个fstream 对象中只有一个文件指针,不论输入 还是输出都使用该指针; 在stringstream 类中,字符串流的输入输出指针 (描述符)是独立的。 C++流库的设计很令人费解,stringstream 中针对输入输出各有一个指针,但 在fstream 中,又只有一个指针。在fstream 中 tellp 与tellg 功能相同, seekp 与seekg 也相同,而在stringstream 中,两对函数功能又不一样。谁要 是只看名字不查标准,那就会被坑死!在这一点上,C++是很令人讨厌的。 以下为邮件原文 崔老师: 您好。 最近和您在讨论 istream::tellg / istream::seekg 和 ostream::tellp / ostream::seekp 。现在把我获得的信息在这里整理。 在 Arch Linux 下的 GCC 4.9.2-4 编译并测试。 实验 测试代码 #include iostream #include fstream using namespace std; int main() { fstream file(test, ios::in | ios::out | ios::trunc); file.write(aoeuhtns, 8); cout After write: file.tellg() file.tellp() endl; file.seekg(2); cout After seekg: file.tellg() file.tellp() endl; file.seekp(4); cout After seekp: file.tellg() file.tellp() endl; return 0; } 实验结果 c++ git:(master) ✗ % g++ --std=c++98 t.cpp; ./a.out 15:34 After write:8 8 After seekg:2 2 After seekp:4 4 c++ git:(master) ✗ % g++ --std=c++03 t.cpp; ./a.out 15:34 After write:8 8 After seekg:2 2 After seekp:4 4 c++ git:(master) ✗ % g++ --std=c++14 t.cpp; ./a.out 15:34 After write:8 8 After seekg:2 2 After seekp:4 4 结论 对于以读写方式打开的文件,读和写指针是共用的。可能是因为纵使传给 G++ 的标准不同,但都用的是同样的 STL (/usr/include/c++/4.9.2 ),所以结果 相同。 源代码分析 在 /usr/include/c++/4.9.2/fstream 中,通过包含 istream 和 ostream 实现代 码重用。 在 /usr/include/c++/4.9.2/bits/istream.tcc 中,通过 pubseekoff 返回结 果。

您可能关注的文档

文档评论(0)

jiupshaieuk12 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

版权声明书
用户编号:6212135231000003

1亿VIP精品文档

相关文档