标准中的奇怪字符::vector<TCHAR*>
Weird characters in a std::vector<TCHAR*>
试图获取所有子目录,最终在子目录中的所有文件,我将传递一个std :: vector作为对实际获取所有目录的函数的引用。我可以在函数内部表达cfilename,但是一旦返回主,向量具有奇怪的字符。
当前有我的角色设置用于使用Unicode。当我使用多键时,它实际上会打印出奇怪的字符,现在它没有打印。向量确实有东西(Directories.size()返回值> 0)
什么也没想到。希望这是一个很好的问题。谢谢
#include <iostream>
#include <vector>
#include <Windows.h>
#include <tchar.h>
#include <stdio.h>
// Declare function prototypes
DWORD listDirectories(std::vector<TCHAR*>&);
// Global variable that holds the current working path of the program
TCHAR buffer[MAX_PATH];
void main()
{
// Declare variables, dwCount for return value from listDirectories, directories stores all sub directories, cDirectory stores current directory
DWORD dwCount;
//std::vector<TCHAR*> directories;
std::vector<TCHAR*> directories;
TCHAR cDirectory[MAX_PATH];
// Get current directory
GetCurrentDirectory(MAX_PATH, buffer);
// Set cDirectory (current directory) to buffer (ATM is current directory) + add \ to the end and make it the working directory
_tcscpy_s(cDirectory, buffer);
_tcscat_s(cDirectory, L"\*");
// dwCount is count of how many directories found, to be used later
dwCount = listDirectories(directories);
// Range for loop to print each value in the std::vector<TCHAR*> directories
for (auto tStr : directories) {
// Doing wcout here prints weird characters.
std::wcout << tStr << std::endl;
}
std::cin.get();
} // end void main()
DWORD listDirectories(std::vector<TCHAR*> &directories)
{
// Declare variables, count used for number of directories, hFind for FindFirstFile, data used to store file data
DWORD count = 0;
HANDLE hFind = INVALID_HANDLE_VALUE;
WIN32_FIND_DATA data;
TCHAR currentDir[MAX_PATH];
// Copy the current working directory into currentDir, will be used for subDir
_tcscpy_s(currentDir, buffer);
// Append "\*" to buffer to make it a working directory
_tcscat_s(buffer, L"\*");
// Find first file in the current working directory, storying data in data as a reference
hFind = FindFirstFile(buffer, &data);
// If hFind is not an invalid handle
if (hFind != INVALID_HANDLE_VALUE) {
// Go through each file in the directory
do
{
// If the file attributes is a directory
if (data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{
// Create a sub directory
TCHAR subDir[MAX_PATH];
// Fill subDir with current directory + "\" + dir name
_tcscpy_s(subDir, currentDir);
_tcscat_s(subDir, L"\");
_tcscat_s(subDir, data.cFileName);
// Fill subDir with current directory + "\" + dir name
//sprintf_s(subDir, "%s%s%s", currentDir, "\", data.cFileName);
// Add directory to my directories (std::vector<TCHAR*>) if count > 1, because I don't want the "." and ".." directories
if (count > 1){
directories.push_back(subDir);
// Doing wcout here prints the subDir just fine and works properly
std::wcout << subDir << std::endl;
}
// Add 1 to count, used as the return for how many directories found in the current directory
count++;
}
} while (FindNextFile(hFind, &data) != 0);
}
// Return count of directories found. -2 to get rid of the "." and ".." directories
return (count - 2);
} // end DWORD listDirectories(std::vector<TCHAR*>&)
在您的listDirectories()
功能
TCHAR subDir[MAX_PATH];
...
directories.push_back(subDir);
subDir
是函数内do ... while
循环的局部数组,其寿命以循环的每一个迭代结束。
将std::vector<TCHAR*> directories;
更改为std::vector<std::basic_string<TCHAR>> directories;
,您的代码应正常工作。现在,您将复制目录名称,然后将其添加到vector
。
另一种选择是忘记所有TCHAR
东西,而在处理Windows API时只使用所有内容。
std::vector<std::wstring> directories;
wchar_t cDirectory[MAX_PATH];
...
hFind = FindFirstFileW(buffer, &data);
等等
相关文章:
- EASTL矢量<向量<int>>连续的
- 检查TCHAR数组输入是否为带符号整数C++
- 不能将 "void *" 类型的值分配给类型 "TCHAR" 的实体
- 如何在虚幻引擎4中将char*转换为TCHAR?
- 使用什么代替"静态常量 TCHAR *"
- Visual Studio C++:不能使用类型为 "const wchar_t *" 的值来初始化类型为 "TCHAR *" 的实体
- C++ TCHAR* 的文本宏
- 用于从 ANSI 字符串转换为 std::basic_string <TCHAR>的正确函数声明
- 删除unicode def后,无法将QString转换为TCHAR
- 如何将TCHAR转换为常量字符
- 如果使用多字节字符集,为什么TCHAR值会更改
- TCHAR Array to a concatenate LPCSTR
- 将 std::string 转换为 const tchar*
- 将 std::string 转换为具有特殊字符的 FString (TCHAR / wstring)
- 正确的交叉平台从 std::string 转换为 'const TCHAR *'
- C - 创建矢量&lt; vector&lt; double&gt;&gt;矩阵具有分配而不是inizializ
- 使用_tcscpy_s将 CString 复制到 TCHAR*
- 我可以依靠 TCHAR 的定义对我正在使用的字符集做出正确的假设吗?
- C 字符串比较“祝您好运”&gt;“再见”
- MessageBox打印来自TCHAR缓冲区的额外Unicode字符