我有一个读取文件并返回字符串的函数。
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/