C++ std::vector中的奇怪字符
尝试获取所有子目录,最终获取子目录中的所有文件,我将传递一个std::vector作为一个函数的引用,该函数实际获取所有目录。我无法在函数中找到cFileName,但一旦它返回main,向量就有奇怪的字符 当前我的字符集使用Unicode。当我使用多字节时,它实际上会打印奇怪的字符,现在它什么也不打印。该向量在其目录中确实包含某些内容。size返回一个大于0的值 真的想不出什么别的了。希望这是一个好问题。谢谢C++ std::vector中的奇怪字符,c++,winapi,tchar,C++,Winapi,Tchar,尝试获取所有子目录,最终获取子目录中的所有文件,我将传递一个std::vector作为一个函数的引用,该函数实际获取所有目录。我无法在函数中找到cFileName,但一旦它返回main,向量就有奇怪的字符 当前我的字符集使用Unicode。当我使用多字节时,它实际上会打印奇怪的字符,现在它什么也不打印。该向量在其目录中确实包含某些内容。size返回一个大于0的值 真的想不出什么别的了。希望这是一个好问题。谢谢 #include <iostream> #include <vect
#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*>&)
在ListDirectory函数中
subDir是do的本地数组。。。而函数中的循环及其生命周期随着循环的每次迭代而结束
改变std::vector目录;到std::向量目录;你的代码应该能正常工作。现在,您将创建目录名的副本并将其添加到向量中
另一种选择是,在处理Windows API时,忘记所有TCHAR内容,只使用所有内容的宽字符版本
std::vector<std::wstring> directories;
wchar_t cDirectory[MAX_PATH];
...
hFind = FindFirstFileW(buffer, &data);
等等是时候停止使用TCHAR了,除非您仍然支持Win98。将其设置为std::basic_字符串是完美的。我对windows编码知之甚少。这只是我第一次尝试进入它。选择TCHAR是因为我知道它是支持多字节和unicode的char*类型定义。我只想使用wstring,因为我知道它更简单,如果它能与windowsapi一起工作的话。非常感谢。
std::vector<std::wstring> directories;
wchar_t cDirectory[MAX_PATH];
...
hFind = FindFirstFileW(buffer, &data);