- 论坛徽章:
- 4
|
- #python3.2
- #coding=utf8
- #xxx's content is:
- #abc
- #abc
- import os
- stream = open('xxx', 'r+')
- print(stream.readline())
- #stream.seek(0, os.SEEK_CUR)
- stream.write('111\n')
- stream.close()
复制代码 自己跑这个代码, 先跑带注释的, 再跑没注释的.
文件xxx最初是:
abc
abc
第一次跑, 你发现111写在第三行, 结果是:
abc
abc
111
你应该知道为什么了, 因为readline -> fgets, 而FILE默认是全缓冲的, 所以会预读一些字节并只返回一行, 这里调用一次readline其实已将整个文件读入了缓冲, 并返回了第一行abc. 紧接着write, 因为C标准IO里的FILE结构体, 读写共享同一个缓冲区, 所以你接着写实际是将111追加到缓冲区, 此时缓冲区里是abc\n111\n, stream.close时将缓冲区里的字节全部dump到磁盘, 所以你看到abc\nabc\n111\n.
为什么加fseek就好了? 因为这个函数会刷新缓冲区, 所以write不会受到read缓冲的影响. |
|