std::ofstream ofs; ofs << "Hello, world!" << endl;
字符串现在我想在写入磁盘之前将ofs的内容修改为"Hello, money!"。如何实现?
ofs
"Hello, money!"
n9vozmp41#
std::endl IO操作器将刷新流缓冲区的内容,因此如果您稍后想要在其内容被刷新之前处理流,则必须将其更改为'\n'。此外,假设您实际上想要这样做的原因是因为您需要操作格式化后将要写入的字符串,我将让您意识到这样一个事实,即您可以使用std::ostringstream来利用格式化流的功能并将结果收集到字符串中,然后您可以操作并通常写入文件。如果这对您来说是显而易见的信息,并且您的用例更复杂,那么您必须编写自己的流缓冲区,正如@MatsPetersson所指出的那样。
std::endl
'\n'
std::ostringstream
jvlzgdj92#
编辑:你应该创建一个从filebuf派生的类(为了讨论的目的,myfilebuf),并使用它来构造一个ostream,这比上面的更准确。在myfilebuf中,您实现了sputbackc,并有一个语句机来识别“Hello,World!",并将其替换为“Hello,Money!",这可能意味着缓冲第二层,直到您知道它是哪一层。
filebuf
myfilebuf
ostream
sputbackc
mwngjboj3#
没有什么好的方法可以对fstream进行通用的修改,所以解决方案是不要使用fstream,而是将数据写入stringstream,然后修改它,再将它写入磁盘。
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();
字符串
3条答案
按热度按时间n9vozmp41#
std::endl
IO操作器将刷新流缓冲区的内容,因此如果您稍后想要在其内容被刷新之前处理流,则必须将其更改为'\n'
。此外,假设您实际上想要这样做的原因是因为您需要操作格式化后将要写入的字符串,我将让您意识到这样一个事实,即您可以使用
std::ostringstream
来利用格式化流的功能并将结果收集到字符串中,然后您可以操作并通常写入文件。如果这对您来说是显而易见的信息,并且您的用例更复杂,那么您必须编写自己的流缓冲区,正如@MatsPetersson所指出的那样。
jvlzgdj92#
编辑:你应该创建一个从
filebuf
派生的类(为了讨论的目的,myfilebuf
),并使用它来构造一个ostream
,这比上面的更准确。在
myfilebuf
中,您实现了sputbackc
,并有一个语句机来识别“Hello,World!",并将其替换为“Hello,Money!",这可能意味着缓冲第二层,直到您知道它是哪一层。mwngjboj3#
没有什么好的方法可以对fstream进行通用的修改,所以解决方案是不要使用fstream,而是将数据写入
stringstream
,然后修改它,再将它写入磁盘。字符串