Я хочу, чтобы иметь возможность открыть файл в моем приложении Win32. Метод, который я использую, - это получение корневого пути из поля редактирования, например. «C: \ MyFolder» (присваивается значение strPathToSource
). Затем я хочу добавить другую строку, например. «\ source \ Utilities \ File.h» и сохраните конкатенированный путь в новой переменной strPathToFile
.Согласование LPTSTR с const char * (Win32 C++)
Таким образом, 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 не найден". Я считаю, что проблема заключается в конкатенации, например.
const char* strPathToFile = char(strPathToSource) + PATH_TO_FILE;
Пошаговые можно увидеть значение strPathToSource
и PATH_TO_FILE
являются, как они должны быть, но каскадный результат в strPathToFile
имеет значение NULL, я считаю.
Вы не объединяете указатели, используя '+', и вы не смешиваете 'const char *' с 'LPTSTR', так как они разные. Другими словами, ваш код страдает от двух (или более) проблем, которые не связаны друг с другом, но оба могут вызвать проблемы. – PaulMcKenzie
Также - ** никогда ** литые строковые типы. Если компилятор жалуется, что указатели несовместимы, сделайте ** ** ** не отбросить ошибку. Используйте правильные типы строк. – PaulMcKenzie
В Windows лучше не использовать 'std :: ifstream' вообще. Он разбит - по дизайну - из-за отсутствующего конструктора, используя широкую строку символов. Если вы все еще хотите использовать 'std :: ifstream' в Windows, подумайте об использовании расширения Microsoft, которое предоставляет [basic_ifstream c'tor] (https://msdn.microsoft.com/en-us/library/zek0beca.aspx) принимая широкую строку символов. – IInspectable