如何在 C++ 中更改 LPCTSTR 对象?

How can I alter LPCTSTR objects in C++?

我必须修改一些较旧的 C++ 代码,而且我不熟悉该语言。

该代码使用 MFC 对象 CStdioFile 并调用 Open() 来处理文件。

CStdioFile::Open() 采用 LPCTSTR 参数来表示文件名,并且在像 _T("filename.txt").

这样的硬编码时一切正常

但现在我的任务是更改代码,以便我可以遍历文件,或者将文件名作为命令行参数(但是这在 VC++ 项目中有效),我知道如何处理常规的旧 CString 和 char 数组,但后来我收到很多关于无法将 char* 或字符串转换为 LPCTSTR 的错误。

我想要这样的东西:

for( int i = 0; i < NUM_FILES; i++) {
  if (m_file.Open(_T("sample00" + std::to_string(i) + ".txt"), CFile::modeCreate | CFile::modeWrite | CFile::shareDenyNone | CFile::typeText, NULL))
  {
    // Do something
  {
}

我读过的关于解决与我的问题类似但不等同的问题的文章充满了关于没有经验的开发人员在 C++ 中弄乱字符串的警告(作为 Python 开发人员,我不知道我有多好有了)。

请指教

_T 是一个宏,它基本上允许编译器根据 _UNICODE 预处理器宏的值生成普通的 C 字符串文字或宽字符串文字。

我认为这将满足您对第一个代码示例的要求:

_TCHAR buffer[1024];
for( int i = 0; i < NUM_FILES; i++) {
    _stprintf(buffer, _T("sample%03d.txt"), i);
    if (m_file.Open(buffer, CFile::modeCreate | CFile::modeWrite | CFile::shareDenyNone | CFile::typeText, NULL))
    {
        // Do something
    }
}

LPCTSTRconst char *const wchar * 的 typedef 名称,具体取决于您使用的是 Unicode 还是 MBCS/ASCII 字符串。以现代风格执行此操作的最佳方法是首先构建字符串,然后使用 c_str().

转换为原始字符串
for( int i = 0; i < NUM_FILES; i++) 
{
    std::string filename = "sample00" + std::to_string(i) + ".txt";
    if (m_file.Open(filename.c_str(), CFile::modeCreate | CFile::modeWrite | CFile::shareDenyNone | CFile::typeText, NULL))
    {
        // Do something
    }
}

如果您继续使用 MFC,您可以简单地使用 CString

CString s;
s.Format(_T("sample%03d.txt"),i);
m_file.Open(s,....)

我的建议:

for (int i = 0; i < NUM_FILES; i++)
{
    if (m_file.Open(CString(_T("sample00")) + CString(std::to_string(i).c_str()) + _T(".txt"), CFile::modeCreate | CFile::modeWrite | CFile::shareDenyNone | CFile::typeText, NULL))
    {
        // Do something
        {
        }
    }
}

您将 C++ 的 std::string 对象与 MFC 的 LPCTSTR 和 CString 对象混淆了。两者都拨号时,您必须进行一些转换。 CStdio 文件在其第一个参数中接受 LPCTSTR,您可以将 CString 传递给它,因为 CString class 实现了将隐式将其转换为 LPCTSTR 实体的转换运算符。