gpt4 book ai didi

c++ - 将(文件读取)函数返回值转换为 c_str() 未按预期运行

转载 作者:太空狗 更新时间:2023-10-29 23:50:05 27 4
gpt4 key购买 nike

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

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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com