连接 LPTSTR 与 const char* (Win32 C++)
Concatenating LPTSTR with const char* (Win32 C++)
我希望能够在我的 Win32 应用程序中打开一个文件。
我使用的方法是从编辑框检索根路径,例如"C:\MyFolder"(这个赋值给strPathToSource
)。然后我想附加另一个字符串,例如"\source\Utilities\File.h" 并将连接的路径存储在新变量 strPathToFile
.
中
所以strPathToFile
应该包含"C:\MyFolder\source\Utilities\File.h",然后可以使用infile.open(strPathToFile)
打开。
相关代码如下:
ifstream infile;
int bufSize = 1024;
LPTSTR strPathToSource = new TCHAR[bufSize];
GetDlgItemText(hWnd, IDC_MAIN_EDIT_FILEPATH, strPathToSource, bufSize); // Get text from edit box and assign to strPathToSource
const char* strPathToFile = char(strPathToSource) + PATH_TO_FILE;
infile.open(strPathToFile);
if(!infile)
{
log(hWnd, "File.h not found.");
return false;
}
其中 PATH_TO_FILE
定义为:
const char* PATH_TO_FILE = "\source\Utilities\File.h";
我的问题是它总是注销 "File.h not found"。我认为问题在于串联,例如
const char* strPathToFile = char(strPathToSource) + PATH_TO_FILE;
单步执行我可以看到 strPathToSource
和 PATH_TO_FILE
的值是它们应该的值,但我认为 strPathToFile
中的串联结果是 NULL 值。
添加两个字符指针不会连接字符串,它只是添加两个指针值(如"numbers")。所以你最终得到了一个无效的指针。
此外,从 LPTSTR 到 char* 的类型转换不是一个好主意,因为 TCHAR 也可以是宽字符,具体取决于当前的构建设置。
(实际上,您是将 LPTSTR 转换为 char,而不是指针,这更加错误)
我认为最简单的方法是将两个字符串都转换为 std::string(或 wstring),在那里您可以使用“+”运算符进行连接。
一种可能性:
const std::wstring strPathToFile = cvt2wstring(strPathToSource) + cvt2wstring(PATH_TO_FILE);
cvt2wstring 定义为:
#include <codecvt>
#include <string>
std::wstring cvt2wstring(const char * str)
{
std::wstring_convert<std::codecvt_utf8_utf16<wchar_t> > converter;
return converter.from_bytes(str);
}
std::wstring cvt2wstring(const wchar_t * str)
{
return str;
}
根据实际类型,选择合适的重载。
为了相反的转换为std::string(这样你就可以使用正则的std::ifstream)你可以切换方向:
std::string cvt2string(const char * str)
{
return str;
}
std::string cvt2string(const wchar_t * str)
{
std::wstring_convert<std::codecvt_utf8_utf16<wchar_t> > converter;
return converter.to_bytes(str);
}
对我来说,ifstream::open() 似乎可以与 wstring 一起使用(但它可能是 MSVC 扩展,因为 C++ 标准不提供这一点——无论如何,如果你使用 TCHAR & comp。你可能瞄准 Windows 和 MSVC).
Martin Bonner 基本上给出了正确答案。
简而言之,最好的解决办法是完全忽略 TCHAR
。它的历史可以追溯到上个世纪的最后十年,当时 Unicode 对具有 4 MB RAM 的 PC 来说是个问题。今天 4 GB 很常见,是 1000 倍。
但是,如果你还想活在那个时代,那就要始终如一。不定义
const char* PATH_TO_FILE = "\source\Utilities\File.h";
但使用
const TCHAR * PATH_TO_FILE = _T("\source\Utilities\File.h");
另外,学习使用字符串连接。您可以使用 std::basic_string<TCHAR>::operator+
(简单)或 tcscat
(习惯缓冲区溢出)。
我希望能够在我的 Win32 应用程序中打开一个文件。
我使用的方法是从编辑框检索根路径,例如"C:\MyFolder"(这个赋值给strPathToSource
)。然后我想附加另一个字符串,例如"\source\Utilities\File.h" 并将连接的路径存储在新变量 strPathToFile
.
所以strPathToFile
应该包含"C:\MyFolder\source\Utilities\File.h",然后可以使用infile.open(strPathToFile)
打开。
相关代码如下:
ifstream infile;
int bufSize = 1024;
LPTSTR strPathToSource = new TCHAR[bufSize];
GetDlgItemText(hWnd, IDC_MAIN_EDIT_FILEPATH, strPathToSource, bufSize); // Get text from edit box and assign to strPathToSource
const char* strPathToFile = char(strPathToSource) + PATH_TO_FILE;
infile.open(strPathToFile);
if(!infile)
{
log(hWnd, "File.h not found.");
return false;
}
其中 PATH_TO_FILE
定义为:
const char* PATH_TO_FILE = "\source\Utilities\File.h";
我的问题是它总是注销 "File.h not found"。我认为问题在于串联,例如
const char* strPathToFile = char(strPathToSource) + PATH_TO_FILE;
单步执行我可以看到 strPathToSource
和 PATH_TO_FILE
的值是它们应该的值,但我认为 strPathToFile
中的串联结果是 NULL 值。
添加两个字符指针不会连接字符串,它只是添加两个指针值(如"numbers")。所以你最终得到了一个无效的指针。
此外,从 LPTSTR 到 char* 的类型转换不是一个好主意,因为 TCHAR 也可以是宽字符,具体取决于当前的构建设置。 (实际上,您是将 LPTSTR 转换为 char,而不是指针,这更加错误)
我认为最简单的方法是将两个字符串都转换为 std::string(或 wstring),在那里您可以使用“+”运算符进行连接。
一种可能性:
const std::wstring strPathToFile = cvt2wstring(strPathToSource) + cvt2wstring(PATH_TO_FILE);
cvt2wstring 定义为:
#include <codecvt>
#include <string>
std::wstring cvt2wstring(const char * str)
{
std::wstring_convert<std::codecvt_utf8_utf16<wchar_t> > converter;
return converter.from_bytes(str);
}
std::wstring cvt2wstring(const wchar_t * str)
{
return str;
}
根据实际类型,选择合适的重载。
为了相反的转换为std::string(这样你就可以使用正则的std::ifstream)你可以切换方向:
std::string cvt2string(const char * str)
{
return str;
}
std::string cvt2string(const wchar_t * str)
{
std::wstring_convert<std::codecvt_utf8_utf16<wchar_t> > converter;
return converter.to_bytes(str);
}
对我来说,ifstream::open() 似乎可以与 wstring 一起使用(但它可能是 MSVC 扩展,因为 C++ 标准不提供这一点——无论如何,如果你使用 TCHAR & comp。你可能瞄准 Windows 和 MSVC).
Martin Bonner 基本上给出了正确答案。
简而言之,最好的解决办法是完全忽略 TCHAR
。它的历史可以追溯到上个世纪的最后十年,当时 Unicode 对具有 4 MB RAM 的 PC 来说是个问题。今天 4 GB 很常见,是 1000 倍。
但是,如果你还想活在那个时代,那就要始终如一。不定义
const char* PATH_TO_FILE = "\source\Utilities\File.h";
但使用
const TCHAR * PATH_TO_FILE = _T("\source\Utilities\File.h");
另外,学习使用字符串连接。您可以使用 std::basic_string<TCHAR>::operator+
(简单)或 tcscat
(习惯缓冲区溢出)。