如果需要,创建一个ofstream

时间:2014-02-13 13:30:27

标签: c++ visual-c++ ofstream

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

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

  

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

然后我想检查他们是否都有一个长度超过""的fileName,如下所示:

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

我的问题已经出现,因为我希望能够创建一个ofstream如果hasFile1 == truehasFile2相同,这两个都应该在函数{{}中稍后使用1}}。

我尝试过这样的事情:

foo

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

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

并且所有各种组合都提供不完整类型不允许错误或我无法分配指针。

问题的主要问题是如何分配std::ofstream* data; if(hasFile1) { data = new std::ofstream(fileName1)/std::ofstream(fileName1); } ,以便您不需要维护3个代码块,这些代码块具有使用ofstream的各种组合?

任何帮助都将非常感谢!!

3 个答案:

答案 0 :(得分:2)

“不完整类型”错误是因为您未包含<fstream>来获取ofstream的定义。

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

第二个工作(一旦定义了ofstream),但是一个坏主意,因为你现在有一个指向动态分配资源的原始指针。你很可能不会正确删除它,造成内存泄漏或其他问题。

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

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

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

的东西
bool hasFile1 = (fileName1[0] != '\0');

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

bool hasFile1 = !fileName1.empty();

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

const char*if(fileName1 == "")的比较可能与您的预期无关。它比较了两个const char*指针,而不是它们的值。使用strlen()(检查为零)或strcmp()来比较C字符串。

你是否包括fstream