我是一个C/C++初学者,尝试构建一个看起来像一个非常简单的程序:它将一个文件加载到一个c字符串中(const char *) 。然而,尽管该程序非常简单,但它并不以我理解的方式工作。请看:C字符串与const char *混淆了我...请帮助
#include <iostream>
#include <fstream>
std::string loadStringFromFile(const char* file)
{
std::ifstream shader_file(file, std::ifstream::in);
std::string str((std::istreambuf_iterator<char>(shader_file)), std::istreambuf_iterator<char>());
return str;
}
const char* loadCStringFromFile(const char* file)
{
std::ifstream shader_file(file, std::ifstream::in);
std::string str((std::istreambuf_iterator<char>(shader_file)), std::istreambuf_iterator<char>());
return str.c_str();
}
int main()
{
std::string hello = loadStringFromFile("hello.txt");
std::cout << "hello: " << hello.c_str() << std::endl;
const char* hello2 = loadCStringFromFile("hello.txt");
std::cout << "hello2: " << hello2 << std::endl;
hello2 = hello.c_str();
std::cout << "hello2 = hello.c_str(), hello2: " << hello2 << std::endl;
return 0;
}
输出看起来是这样的:
hello: Heeeeyyyyyy
hello2: 青!
hello2 = hello, hello2: Heeeeyyyyyy
初始hello2值的每一次变化,总有一些随机的汉字(我用的是日本的电脑,所以我猜这就是为什么它是汉字)。
在我的天真视图中,似乎两个值应该打印相同。一个函数返回一个C++字符串,然后我将其转换为一个c字符串,另一个函数加载该字符串,将该字符串转换并返回。我确信,该字符串被正确地加载在loadCStringFromFile由couting的价值之前,我回来了一下,确实是我所想象的,例如:
/*(inside loadCStringFromFile)*/
const char* result = str.c_str();
std::cout << result << std::endl;//prints out "Heeeyyyyyy" as expected
return result;
那么,为什么值的变化?感谢您的帮助...
在loadCStringFromFile中,将文本加载到本地变量,然后返回该变量的内部缓冲区。当函数结束时,你有一个指向释放内存的指针(它是垃圾)。用std :: string你会返回一个完整的有效副本。 – 2012-08-05 10:18:06
我还没有看到你的问题,但+1 *仅用于*你的第一段。它写得很好(至少与StackOverflow中的大多数其他类似问题相比)。我希望你得到一个真棒答案,并继续回来问更多的问题! :) – Mehrdad 2012-08-05 10:45:57
由于这个问题是'C++'标记的,我建议将来不要使用没有很好理由的C字符串。 std :: string对于大多数程序(有时甚至更多)是高效的。 – MasterMastic 2012-08-05 11:40:42