1

我希望能够在我的 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 值。

4

2 回答 2

2

添加两个字符指针不会连接字符串,它只是添加两个指针值(作为“数字”)。所以你最终得到一个无效的指针。

此外,从 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)。

于 2016-02-03T14:15:08.693 回答
1

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(习惯于缓冲溢出)。

于 2016-02-03T15:59:10.043 回答