Странные символы в std :: vector <TCHAR*>

70
4

Попытка получить все вспомогательные каталоги и, в конечном итоге, все файлы в подкаталогах, и я передаю std :: vector как ссылку на функцию, которая фактически получает все каталоги. Я могу отключить cFileName внутри функции, но как только он вернет основной вектор, у него будут странные символы.

В настоящее время мой набор символов использует Unicode. Когда я использовал multibyte, он действительно печатал бы странные символы, теперь он ничего не печатает. У вектора есть что-то в нем (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*>&)

спросил(а) 2015-05-12T03:38:00+03:00 5 лет, 5 месяцев назад
1
Решение
91

В вашей функции 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 и просто использовать версии с широким символом всего, что TCHAR с Windows API.

std::vector<std::wstring> directories;
wchar_t cDirectory[MAX_PATH];
...
hFind = FindFirstFileW(buffer, &data);

и так далее

ответил(а) 2015-05-12T03:46:00+03:00 5 лет, 5 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема