将const char *传递给file.open(),这是一种奇怪的行为

时间:2016-11-24 13:41:26

标签: c++ c++11

我遇到下面的代码问题。根据我正在使用的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();
}

2 个答案:

答案 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());

之类的操作