std::ofstream ofs;
ofs << "Hello, world!" << endl;
现在我想在写入磁盘之前将
ofs
的内容修改为"Hello, money!"
。
我该如何实施?
std::endl
IO 操纵器将刷新流缓冲区的内容,因此如果您稍后想要在刷新其内容之前处理流,则必须将其更改为 '\n'
。
另外,假设您实际上想要这样做的原因是因为您需要操作格式化后要写入的字符串,我将使您意识到您可以使用
std::ostringstream
来利用格式化流的功能并将结果收集到一个字符串中,然后您可以对其进行操作并正常写入文件。
如果这对您来说是显而易见的信息,并且您的用例更加复杂,那么您将必须编写自己的流缓冲区,正如@MatsPetersson 所指出的。
编辑:您应该创建一个从
filebuf
派生的类(出于本次讨论 myfilebuf
的目的,并使用它来构造 ostream
,这比上面的更准确。
在
myfilebuf
中,您实现sputbackc
,并有一个状态机来识别“Hello,World!”,并将其替换为“Hello,Money!”,这可能意味着缓冲第二层,直到您知道它是什么。
没有好方法对 fstream 进行通用修改。所以解决方案是不使用 fstream。相反,请将数据写入
stringstream
,然后修改它,然后将其写入磁盘。
//write to stringstream
std::stringstream ss;
ss << "Hello, world!" << endl;
//modify stringstream
std::string text = ss.str();
text.replace(7, 5, "money");
ss.str(text);
//write stringstream to disk
std::ofstream ofs;
ofs << ss.rdbuf();