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