如果这是一个完全愚蠢的问题,我很抱歉,但我仍遇到问题。
我正在尝试将两个std::string fileNames
传递给函数foo
,如下所示:
foo(int SomeValue,std :: string fileName1,std :: string fileName2)
然后我想检查他们是否都有一个长度超过""
的fileName,如下所示:
bool hasFile1 = true;
if(fileName1.empty())
{
hasFile1 = false;
}
我的问题已经出现,因为我希望能够创建一个ofstream
如果hasFile1 == true
和hasFile2
相同,这两个都应该在函数{{}中稍后使用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
的各种组合?
任何帮助都将非常感谢!!
答案 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
?