这是我简单程序的一部分
string appData = getenv("APPDATA");
const char *mypath= (appData+"\\MyApplication\\hello.txt").c_str();
cout << mypath;
// output: c:\users\xrobot\appdata\Roaming\Myapplication\hello.txt
fstream file(mypath,ios::in);
ofstream filetemp;
filetemp.open("world.bak");
cout << mypath;
// output: É↕7
为什么mypath在那个奇怪的字符串中改变了?
答案 0 :(得分:7)
您应该使用std::string
作为:
std::string appData = getenv("APPDATA");
std::string path = appData+"\\MyApplication\\hello.txt";
然后这样做:
const char * mypath = path.c_str();
请注意,不得执行此操作:
const char* mypath = (appData+"\\MyApplication\\hello.txt").c_str();
这是因为右侧的表达式是一个临时表达式,它在表达式结束时被破坏,mypath
将继续指向被破坏的对象。换句话说,它变成了一个悬垂的指针。
-
为什么mypath在那个奇怪的字符串中改变了?
因为在您发布的代码中,mypath
是一个悬空指针,使用它会调用未定义的行为。
这是您应该编写代码的方式:
std::string appData = getenv("APPDATA");
std::string mypath= appData+"\\MyApplication\\hello.txt";
cout << mypath;
fstream file(mypath.c_str(),ios::in);
答案 1 :(得分:5)
你不能添加两个这样的字符串。你应该收到明确的警告。由于您使用的是C ++,因此您可能需要使用std::string
。
答案 2 :(得分:2)
这只是一个临时的std::string
:
(appData+"\\MyApplication\\hello.txt")
因此,在使用表达式后,可以释放底层的C字符串空间。由于你有char*
指向现在的垃圾记忆,你有一个时髦的价值。