【发布时间】:2018-04-09 04:50:18
【问题描述】:
在 C++ 中有没有办法使用标准库来覆盖大文件中的二进制数据并保留文件中的其余现有数据而无需先加载整个文件?
示例:如果我有一个包含文本“ABC”的文件“MyFile”并且想用“Q”替换“A”,有没有办法在不将“BC”加载到内存的情况下这样做?
到目前为止我所拥有的:
#include <fstream>
int main(int argc, char** argv)
{
std::fstream f;
f.open("MyFile",std::ios::in);
while (f.good())
{
char Current = f.get();
if (Current == 'A')
break;
}
int Location = f.gcount()-1;
f.close();
if (Location < 0)
{
printf("Nothing to do.\n");
return EXIT_SUCCESS;
}
else
{
f.open("MyFile",std::ios::in | std::ios::out);
f.seekp(Location);
f.write("Q",1);
//f.put('Q');
//f << "Q";
f.close();
return EXIT_SUCCESS;
}
}
现在看来可以了 - 谢谢大家。
【问题讨论】:
-
你为什么要这样做?这看起来像您正在尝试使用文件作为您的数据库大声笑
-
虽然在用户级别您可能会看到 1 字节的读取,但在操作系统/硬件级别上,来自文件的单个负载要大得多。这样做是为了优化,因为访问硬盘很慢。
-
我正在尝试将文件用作数据库 (^.^) - 这是要安装在资源极其有限的机器上,因此只有标准 C++ 库可用。