这是我简单程序的一部分
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
Run Code Online (Sandbox Code Playgroud)
为什么mypath在那个奇怪的字符串中改变了?
你应该std::string用作:
std::string appData = getenv("APPDATA");
std::string path = appData+"\\MyApplication\\hello.txt";
Run Code Online (Sandbox Code Playgroud)
然后这样做:
const char * mypath = path.c_str();
Run Code Online (Sandbox Code Playgroud)
请注意,您不能这样做:
const char* mypath = (appData+"\\MyApplication\\hello.txt").c_str();
Run Code Online (Sandbox Code Playgroud)
这是因为右侧的表达式是一个临时表达式,它在表达式结束时被破坏并mypath继续指向被破坏的对象.换句话说,它变成了一个悬垂的指针.
-
为什么mypath在那个奇怪的字符串中改变了?
因为在您发布的代码中,mypath是一个悬空指针,使用它来调用未定义的行为.
这是你应该编写代码的方式:
std::string appData = getenv("APPDATA");
std::string mypath= appData+"\\MyApplication\\hello.txt";
cout << mypath;
fstream file(mypath.c_str(),ios::in);
Run Code Online (Sandbox Code Playgroud)