关于C++输入输出流的原理知识

ChristopherWu 2014-08-18 03:11:26
求关于C++输入输出流的原理的资料,TC++PL,《C++标准库》、《C++编程思想》、《程序员的自我修养》这几本关于这部分的知识都已拜读,可还是砍获甚少,网上找到的一些都是于我而言隔靴搔痒的资料,大多数都在说怎么样用,而不是怎么实现。

我想知道大致实现和设计:P ,请问各位有推荐吗?谢谢
Thanks in advanced.
更多0
...全文
666 14 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
YGguang 2014-08-24
  • 打赏
  • 举报
回复
这个我之前学做驱动的时候有了解过一些,不过不知道对不对,以下是我的理解: 流我把它的数据结构理解成队列,因为具有先入先出的特性。而缓存区便是在内存开辟的一块空间,用于存放这个队列。 先说标准输出,便是将流读到显示器上。怎么读进去的呢?跟显示器的驱动有关系。大概就是系统调用了显示器的驱动函数,将流的内存地址跟读取流的大小做为参数传递进去。而setw这类格式化的函数我猜想只是在读取内存的时候对数据做些变化而已,至于细节如何,我没看过资料!其实我只读过Uboot里的printf函数的实现。那么输出到文件也就是同一个道理了。 而标准输入的话,我觉得道理差不多,不过是键盘的敲击使得系统中断,然后得到键盘值将值写入输入缓存区,其他程序可以获取这个缓存区上的数据,数据结构也是队列结构。 以上纯属个人理解,只是自己的体会,具体也没看过书有相关的描述,如果逻辑讲不通的可以提出来!共同学习进步!
反转灵魂 2014-08-21
  • 打赏
  • 举报
回复
引用 12 楼 ChristopherWu 的回复:
[quote=引用 11 楼 taodm 的回复:] 前3章有个毛用
前3章已经是第一部分的全部了,剩下的第二部分是国际化。目前我并不需要(兴趣也不是十分大)去学习。[/quote] 要么不看,要么刨根问底,否则就是浪费自己的时间。
ChristopherWu 2014-08-20
  • 打赏
  • 举报
回复
引用 11 楼 taodm 的回复:
前3章有个毛用
前3章已经是第一部分的全部了,剩下的第二部分是国际化。目前我并不需要(兴趣也不是十分大)去学习。
taodm 2014-08-20
  • 打赏
  • 举报
回复
前3章有个毛用
ChristopherWu 2014-08-20
  • 打赏
  • 举报
回复
引用 8 楼 taodm 的回复:
看《标准C++输入输出流与本地化》这本宝典。
看了前三章实现的部分,感觉还是差了一点深入:)
FeelTouch Labs 2014-08-18
  • 打赏
  • 举报
回复
楼主真想弄清来龙去脉,一个必然的的方法是,查看 标准I/O库 标准IO库是于1975年左右编写完成的,用于处理流和文件的一个库. 标准IO库可以在很多操作系统下移植 经过30多年,标准IO库没有发生什么重大变化
taodm 2014-08-18
  • 打赏
  • 举报
回复
看《标准C++输入输出流与本地化》这本宝典。
DoDoMouse 2014-08-18
  • 打赏
  • 举报
回复
引用 5 楼 zhao4zhong1 的回复:
计算机组成原理→DOS命令→汇编语言→C语言(不包括C++)、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言(包括C++)、架构…… 对学习编程者的忠告: 眼过千遍不如手过一遍! 书看千行不如手敲一行! 手敲千行不如单步一行! 单步源代码千行不如单步Debug版对应汇编一行! 单步Debug版对应汇编千行不如单步Release版对应汇编一行! 单步类的实例“构造”或“复制”或“作为函数参数”或“作为函数返回值返回”或“参加各种运算”或“退出作用域”的语句对应的汇编代码几步后,就会来到该类的“构造函数”或“复制构造函数”或“运算符重载”或“析构函数”对应的C/C++源代码处。 VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。 对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。 (Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)
赵老师是个好老师
赵4老师 2014-08-18
  • 打赏
  • 举报
回复
提醒:STL源代码很多都没有扩展名。
赵4老师 2014-08-18
  • 打赏
  • 举报
回复
计算机组成原理→DOS命令→汇编语言→C语言(不包括C++)、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言(包括C++)、架构…… 对学习编程者的忠告: 眼过千遍不如手过一遍! 书看千行不如手敲一行! 手敲千行不如单步一行! 单步源代码千行不如单步Debug版对应汇编一行! 单步Debug版对应汇编千行不如单步Release版对应汇编一行! 单步类的实例“构造”或“复制”或“作为函数参数”或“作为函数返回值返回”或“参加各种运算”或“退出作用域”的语句对应的汇编代码几步后,就会来到该类的“构造函数”或“复制构造函数”或“运算符重载”或“析构函数”对应的C/C++源代码处。 VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。 对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。 (Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)
ChristopherWu 2014-08-18
  • 打赏
  • 举报
回复
谢谢大家的回复,我是楼主。 收获甚少指的是里面的知识甚少设计实现及设计,而是如何使用。 比如:我知道流是有缓冲区,缓冲区满了后(或者flush)就会输出,但是具体是如何实现输出? 又如:流的setw,set精度这些又是如何实现? 如何将int等类型转换成字符串?
百曉生 2014-08-18
  • 打赏
  • 举报
回复
看完这些书的这部分分知识,收获甚少,那就这么提问,别人能在回复中讲清? 看这里的文几篇文章有帮助没——http://see.xidian.edu.cn/cpp/biancheng/cpp/jichu_13/
反转灵魂 2014-08-18
  • 打赏
  • 举报
回复
首先得敬告楼主,你看的这些书中,编程思想非常不错。但是IT这方面的书,不是说看一遍就行的,起码看5年。关于你的问题: 1. iostream istream 从流中读取 ostream 写到流中去 iostream 对流进行读写;从 istream 和 ostream 派生而来 2. fstream ifstream 从文件中读取;由 istream 派生而来 ofstream 写到文件中去;由 ostream 派生而来 fstream 读写文件;由 iostream 派生而来 3. sstream istringstream 从 string 对象中读取;由 istream 派生而来 ostringstream 写到 string 对象中去;由 ostream 派生而来 stringstream 对 string 对象进行读写;由 iostream 派生而来 IO对象不可复制或赋值。 注意的是:如果程序崩溃了,则不会刷新缓冲区。所以可以将输入输出绑定在一起。 关于访问,可以实用流迭代器。
mujiok2003 2014-08-18
  • 打赏
  • 举报
回复
1. C++的IO流是字符流(不是字节流) 2. 结构:底层是streambuf(及其子类stringstreambuf, filestreambuf),基本上大部分的工作都在这里完成的。 对外的接口stream(istream, iostream, ostream及其子类)提供了类型安全检查, 可扩展性等。 3. 实现:大部分源码都是模板, 可以直接阅读,少部分在CRT中(比如std::cout, std::cin等), 也源码的。

65,186

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧