如果需要,创建一个流

Creating an ofstream if needed

本文关键字:一个 创建 如果      更新时间:2023-10-16

如果这是一个完全愚蠢的问题,我很抱歉,但我还是遇到了麻烦。

我正试图将两个std::string fileNames传递给函数foo,如下所示:

foo(int SomeValue,std::string fileName1,std:;string fileName2)

然后我想检查它们是否都有一个比""长的fileName,如下所示:

bool hasFile1 = true;
if(fileName1.empty())
{
hasFile1 = false;
}

我的问题一直存在,因为我希望能够在hasFile1 == true的情况下创建ofstream,而在hasFile2的情况下也可以创建,这两个都应该稍后在函数foo中可用。

我试过做一些事情,比如:

std::ofstream file1;
if(hasFile1)
{
file1 = new std::ofstream(fileName1);
}

但问题是file1是一个不完整的类型。我尝试的另一种方法是

std::ofstream* data;
if(hasFile1)
{
data = new std::ofstream(fileName1)/std::ofstream(fileName1);
}

并且所有的各种组合都给出了不允许的不完整类型错误或者我不能分配给指针。

问题的要点是如何分配ofstream,这样就不需要维护3个代码块,这些代码块具有正在使用的ofstreams的各种组合?

任何帮助都将不胜感激!!

"不完整类型"错误将是因为您没有包含<fstream>来获得ofstream的定义。

第一种方法不起作用,因为您正试图将指针(由new返回)分配给对象。在大多数情况下,您会指定一个对象;但不幸的是,流是不可分配的,即使通过移动也是如此。

第二种方法是可行的(一旦定义了ofstream),但这不是一个好主意,因为您现在有一个指向动态分配资源的原始指针。您很可能没有正确删除它,从而导致内存泄漏或其他问题。

这可以通过使用智能指针而不是原始指针来减轻;但在ofstream的情况下,如果没有文件打开,可以简单地将其关闭:

std::ofstream file1;
if(hasFile1) {
file1.open(fileName1);
}

此外,请注意您没有正确初始化hasFile1;并且您通常不能使用==来比较C样式字符串。你想要更像的东西

bool hasFile1 = (fileName1[0] != '');

或者,如果将文件名参数更改为更友好的std::string

bool hasFile1 = !fileName1.empty();

当您将字符串作为指针传递时,您会尝试将它们与另一个指针(文本"")进行比较,该指针永远不会为真(当然,除非您传递字符串文本"",编译器只保留该特定字符串文本的一个副本,以便共享指向该文本的指针)。

对字符串使用std::string,或者如果您想要旧的C样式字符串指针,请使用std::strlen来检查空字符串。

if(fileName1 == "")中比较const char*可能无法达到预期效果。它比较两个const char*指针,而不是它们的值。使用strlen()(检查零)或strcmp()来比较C字符串。

你包括fstream吗?

相关文章: