我遇到了麻烦ofstream
,那就是-当我ofstream
像这样更改对象的值时
ofstream o_save;
/*code*/
o_save = ofstream(filename); //Problem is here
...上面的行完全擦除文件的内容。
问题是我如何合法地改变objectfilename
的值?ofstream
PS我在声明它时无法定义它,因为我希望它是全局的并且我不确定我选择了哪个保存文件。
这个问题相当模糊和矛盾,问完这个问题,OP似乎已经睡着了。因此,我将尝试窥探他的内心,并尝试详细说明他想要什么。
对于打开文件,有多种模式。像这样打开它。
ofstream o_value ;
o_value.open("file.txt") ;
如果要保留该文件的原始内容,请使用..
o_value.open("file.txt", ios::app) ;
如果您想稍后关闭它并打开另一个,请使用...关闭
o_value.close() ;
在ofstream
. 您可以使用rename
来自<cstdlib>
. 您可以使用remove("file.txt")
in删除文件<cstdio>
。
“更改对象的名称”是什么意思ofstream
?对象唯一的“名称”ofstream
是变量的名称。ofstream
对象是数据流。您可以(在某些系统上)使用 更改与之关联的文件的名称rename
,但不知何故,我认为这也不是您想要的。您还可以关闭流,然后在另一个文件上重新打开它。
您不能在 iostream 对象之间进行分配。如果情况变得更糟,您可以将全局对象声明为指针,并分配给它(使用*o_save
写入它)。
最后,该标准规定,当您打开一个. 文件时ofstream
,您会截断该文件(如果存在的话)。如果这不是您想要做的,那么您必须在打开模式中添加一些标志。例如,如果您添加std::ios_base::app
,您将不再截断文件,并且所有写入都将在文件末尾(原子地,如果系统支持它)。或者(虽然很令人惊讶),您可以添加std::ios::in
到标志;如果文件不存在,这将失败,但允许在文件中的任何位置写入。如果您希望能够在文件的任何位置写入,即使您不想读取它,这是打开文件进行写入的唯一方法。
ofstream
没有某种抽象name
属性,名称只是其某些成员函数的参数,从这个意义上说,询问如何
改变对象
filename
的值ofstream
是没有意义的。
一般来说,您可以使用std::rename
from<cstdlib>
或使用 Boost.Filesystem 重命名文件。