将 LPTSTR 与常量字符连接起来 * (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";
我的问题是它总是注销"找不到文件"。我相信问题在于串联,例如
const char* strPathToFile = char(strPathToSource) + PATH_TO_FILE;
通过一步,我可以看到strPathToSource
和PATH_TO_FILE
的值是应有的,但我相信strPathToFile
中的串联结果是 NULL 值。
添加两个字符指针不会连接字符串,它只是添加两个指针值(作为"数字"(。所以你最终得到一个无效的指针。
此外,从 LPTSTR 到 char* 的类型转换不是一个好主意,因为 TCHAR 也可以是宽字符,具体取决于当前的构建设置。(事实上,您正在将 LPTSTR 转换为字符,而不是指针,这更错误(
我认为最简单的方法是将两个字符串都转换为 std::string(或 wstring(,在那里您可以使用"+"运算符进行连接。
一种可能的做法是:
const std::wstring strPathToFile = cvt2wstring(strPathToSource) + cvt2wstring(PATH_TO_FILE);
CVT2w字符串定义为:
#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 很常见,是一千倍。
但是,如果你仍然想生活在那个时代,那就保持一致。不定义
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++win32 API创建多个类似视口的窗口
- WM_CTLCOLORSTATIC从未在WIN32应用程序中触发
- 检测win32服务创建和删除的最佳方法
- WIN32:C++,为什么在WM_CLOSE上调用Messagebox函数程序正在冻结
- 将 win32 hbitmap 转换为 winrt softwarebitmap
- 使用 WIN32 API (C/C++) 对特定树视图项进行着色
- Alt+Enter 在 Win32 应用中,管理大小调整和分辨率
- VSCode C++ 编译的exe感染了Win32:TrojanX-gen[Trj]
- 从预处理器获取 Windows 版本(C++ Win32)
- Issues with Win32 ReadProcessMemory API
- Win32 发送输入鼠标移动滞后并冻结
- 如何从 Win32 C++ 应用程序输出到父控制台窗口?
- C++线程:如何在一个线程仍在运行时阻止另一个线程执行 (Win32)
- 将 Win32/WinAPI 应用程序移植到 wxWidgets
- Win32 API 控制台光标在 WriteConsole 后不移动
- C++ Win32 Threads
- C++ win32 如何使密码字段可选并启用复制和粘贴?
- LNK1104:无法打开libpjproject-i386-Win32-vc14-Debug-Static.lib
- 如何在 Win32 C++控制台应用程序中调用 UWP 类库