我遇到下面的代码问题。根据我正在使用的IDE,我遇到了不同的行为。
Dev-C ++:运行正常。但是,如果我将GenerateFileName(0,0)
传递给file.open()
,则不会创建任何文件。
Visual Studio 2013:在所有情况下运行正常,但生成的文件名称如下所示
ÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌPùD
或类似的东西,文件本身没有扩展名(我希望有一个.txt
文件)。
int main()
{
ofstream file;
file.open(GenerateFileName(3, 0));
file << 1 << endl;
file.close();
_getch();
}
const char* GenerateFileName(int Instance_nth, int Input_nth)
{
string filename = to_string(Instance_nth);
filename += "_";
filename += to_string(Input_nth);
filename += ".txt";
return filename.c_str();
}
答案 0 :(得分:4)
const char* GenerateFileName(int Instance_nth, int Input_nth)
{
string filename = to_string(Instance_nth);
filename += "_";
filename += to_string(Input_nth);
filename += ".txt";
return filename.c_str();
}
你正在返回一个指向filename
内部存储的数据的指针,当它被GenerateFileName
的结尾销毁时:返回的值是一个悬空指针,你的代码是未定义的行为。< / p>
您可以做的是返回std::string
而不是const char*
:
std::string GenerateFileName(int Instance_nth, int Input_nth)
{
string filename = to_string(Instance_nth);
filename += "_";
filename += to_string(Input_nth);
filename += ".txt";
return filename;
}
用法将成为:
file.open(GenerateFileName(3, 0).c_str());
答案 1 :(得分:1)
这是未定义的行为,因为filename
一旦离开GenenerateFileName
函数就被销毁,而file.open
正在接收指向已经销毁的变量数据的指针。
最简单的方法是从std::string
返回GenerateFileName
并执行file.open(GenerateFileName(0,0).c_str());