**关于读写文件以及 `QFile::copy` 的注意事项** !!! Note 以下要说明的两个错误是在编写 License 控制程序时犯得低级错误。 ## C++ 读写文件要考虑字符编码差异 请看以下代码: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ std::ofstream out("test"); out.close(); std::ifstream in("test"); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 最简单的文件处理语句,如果是在同一机器上运行,显然不会有任何问题。 如果前两句和最后一句分别在不同的机器上,甚至不同操作系统上运行呢?我遇到的 BUG 就是这样 的运行出现了写入读出不一致。看起来很奇怪吧? 我们细看一下这两句,会发现实际上此时的默认参数为 `mode = ios_base::out`, 并按照 text mode 写入读出。既然是 text mode,那么必然会涉及一个头疼而不易发觉的问题: **字符编码**。 默认情况下 C++ 会根据本地编码来写入或读取文本文件,在不同操作系统上,很容易出现本地编码 不同的情况,譬如同样是 Windows 10 Pro,中英文版本也会出现不同。 所以对于文本文件而言,统一编码是必须要做的,虽然这极容易被忽视。 而对于本就设计为不可读的文件,应该果断采用 binary mode 写入。 ## QFile::copy 要注意其默认策略 这个要注意的是:如果文件已经存在,copy 是不起作用的,并会返回 false. 所以如果我们有时需要替换式的 copy,则需要加一句判断: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ if (!QFile::copy("C:\\Foo\\test", "D:\\Foo\\test")) { QFile::remove("D:\\Foo\\test"); QFile::copy("C:\\Foo\\test", "D:\\Foo\\test"); // copy again. } ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 这样写看似有冗余,但比起 里的方案, 实际上要安全一些。 因为如果当参数里的两个路径相同时,起到的效果会是该文件被删除。