如何合法地更改流对象的文件名值

how do i legitimately change filename value of ofstream object?

本文关键字:对象 文件名      更新时间:2023-10-16

我的ofstream有问题,也就是说,当我像这个一样更改ofstream对象的值时

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

上面的一行完全擦除了文件的内容。

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

附言:当我声明它时,我无法定义它,因为我希望它是全局的,而且我不确定我选择了哪个保存文件。

这个问题相当模糊和矛盾,OP在问完这个问题后似乎睡着了。所以我会试着窥探他的内心,并试图详细说明他想要什么。

对于打开文件,有多种模式。像这样打开它。

ofstream o_value ;
o_value.open("file.txt") ;

如果要保留该文件的原始内容,请使用。。

o_value.open("file.txt", ios::app) ;

如果您想稍后关闭它并打开另一个,请使用…关闭它。。。

o_value.close() ;

ofstream的情况下,通常不允许更改文件名。您可以从<cstdlib>使用rename。您可以在<cstdio>中使用remove("file.txt")来删除文件。

"更改ofstream对象的名称"意味着什么?ofstream对象唯一的"名称"是变量ofstream对象是一个数据流。你可以(在一些系统)改变与其相关联的文件的名称,使用rename,但不知怎么的,我认为这不是你想要的任何一个您也可以关闭流,然后在另一个流上重新打开它文件

不能在iostream对象之间进行分配。如果情况更糟更糟糕的是,您可以将全局对象声明为指针,并且分配给它(使用*o_save对其进行写入)。

最后,标准规定,当您打开ofstream时截断文件(如果存在)。如果这不是你想要的要做到这一点,您必须在打开模式中添加一些标志。如果你例如,添加std::ios_base::app,您将不再截断文件,所有写入都将到文件末尾(如果系统支持,则从原子角度)。或者(尽管非常令人惊讶),您可以将std::ios::in添加到标志中;如果文件不存在,但允许写入,则此操作将失败文件中的任何位置。这是打开文件的唯一方法如果你想在文件中的任何地方写,即使你不想读。

ofstream没有某种抽象的name属性,名称只是其一些成员函数的参数,从这个意义上说,它询问如何

更改ofstream对象的filename

毫无意义。

通常,您可以从<cstdlib>重命名具有std::rename的文件,也可以使用Boost.Filesystem.