我如何合法地更改ofstream对象的文件名值?

时间:2012-11-24 11:46:37

标签: c++ ofstream

我遇到了ofstream的麻烦,当我更改ofstream这样的对象的值时

ofstream o_save; 

/*code*/

o_save = ofstream(filename);  //Problem is here

...上面一行完全删除了文件内容。

问题是如何合法地更改filename对象的ofstream值?

P.S。当我声明它时,我无法定义它,因为我希望它是全局的,我不确定我选择哪个保存文件。

3 个答案:

答案 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。