似乎在 Windows 中使用(或)权限打开的文件上write()
紧跟 a不会更新文件。read()
r+
r+b
假设testfile.txt
当前目录中有一个文件,内容如下:
This is a test file.
Run Code Online (Sandbox Code Playgroud)
我执行以下代码:
with open("testfile.txt", "r+b") as fd:
print fd.read(4)
fd.write("----")
Run Code Online (Sandbox Code Playgroud)
我希望代码打印This
并将文件内容更新为:
This----a test file.
Run Code Online (Sandbox Code Playgroud)
这至少在 Linux 上运行良好。但是,当我在 Windows 上运行它时,消息会正确显示,但文件没有改变 - 就像write()
被忽略了一样。如果我调用tell()
文件句柄,它会显示位置已更新(4
在之前write()
和8
之后),但文件没有更改。
但是,如果我fd.seek(4)
在该write()
行之前放置一个明确的内容,那么一切都会按我的预期进行。
有人知道 Windows 下这种行为的原因吗?
作为参考,我在带有 NTFS 分区的 Windows 7 上使用 Python 2.7.3。
编辑
在回应的意见,我都尝试r+b
和rb+
-的官方Python文档似乎意味着前者是规范的。
我fd.flush()
在不同的地方打电话,并在read()
和之间放置一个write()
这样的: …
我对大多数C++都非常熟悉,但我避免的一个领域是IO流,主要是因为我一直在嵌入式系统中使用它们,因为它们不合适.然而,最近我不得不熟悉它们,而我正在努力找出一些我认为应该简单的东西.
我正在寻找一种相对有效的方法从C++流中读取固定数量的字符到std::string
.我可以轻松地char
使用该read()
方法读入临时数组并将其转换为a std::string
,但这相当丑陋且涉及浪费的副本.我还可以将整个流读入一个字符串,如下所示:
std::string getFile(std::fstream &inFile)
{
std::stringstream buffer;
buffer << inFile.rdbuf();
return buffer.str();
}
Run Code Online (Sandbox Code Playgroud)
...但无限读入内存通常是一个糟糕的想法,所以我真的想一次访问一个块,比如4K左右.我也可以一次读取字符,但这比阅读临时char
数组感觉更丑陋,效率更低.
那么,是否有一种简单的方法可以std::string
直接从包含流中下一个N个字符的流中获取?很可能根本就没有办法做到这一点,但我觉得这样的事情会丢失,所以我觉得我必须错过一些明显的东西.
顺便说一下,我对C文件IO API非常熟悉,我不是在寻找涉及它们的解决方案.我可以敲东西了read()
和write()
,但我的工作的代码使用了大量的数据流,并且我认为这是很好的做法,以保持我的代码添加的一贯作风.