我有一个读取文件并返回字符串的函数。

string get_file_contents(const char *filename)
{
    ifstream in(filename);
    if (in)
    {
        ostringstream contents;
        contents << in.rdbuf();
        in.close();
        return(contents.str());
    }
    throw(errno);
}

我读取了一个仅包含success的文件,并以两种不同的方式将其返回值转换为c样式字符串,并获得了不同的结果。
string str = get_file_contents("test.txt");
const char* str1 = str.c_str();
cout << "printing str1: ";
cout << str1 << endl;
const char* str2 = get_file_contents("test.txt").c_str();
cout << "printing str2: ";
cout << str2 << endl;

输出:
printing str1: success
printing str2:

我不明白为什么str2为空。任何见解均表示赞赏。

最佳答案

您的函数调用返回的字符串在两种情况下都是临时的。在该临时目录上调用c_str()将返回一个指针,该指针在语句完成后可能会悬空。使用字符串存储结果是正确的,这就是第一个调用起作用的原因。由于指针悬空,第二个调用可能会产生不良影响。

由于str2是一个指针,因此它不仅是空的,而且还指向不存在的字符串。这可能是危险的。

如第一个调用中那样,将结果存储到另一个字符串中可以由编译器很好地优化。

您也许还可以缩短该文件的读取时间:

...
ifstream in(filename);
if (in)
{
    return string(istreambuf_iterator<char>(in), istreambuf_iterator<char>());
}

// throw exception
...

关于c++ - 转换(文件读取)功能将返回值转换为c_str()行为不符合预期,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33930306/

10-11 03:03
查看更多