Приведение массива char[] (или char* ) в LPCTSTR

polin11
Дата: 29.07.2015 01:40:44
Задача: пользователь вводит директорию, нужно проверить существует ли эта директория.
Функция DirExists проверки работает правильно, но арuумент у этой функции имеет тип LPCTSTR, клиент вводит строку (char[] или char*)
преобразование в LPCTSTR происходит неверно. Просьба помочь преобразовать в LPCTSTR.


#include "stdafx.h"
#include "stdafx.h"
#include <windows.h>
#include <stdio.h>
#include <conio.h>
#include <stdlib.h> 
#include <iostream>
#include<iostream>
#include<fstream>
#include <string>
using namespace std;
bool DirExists(LPCTSTR dir)
{
  DWORD code = GetFileAttributes(dir);
  return code != 0xFFFFFFFF && (FILE_ATTRIBUTE_DIRECTORY & code) != 0;
}
int _tmain(int argc, _TCHAR* argv[])
{
	cout<<"vvedite put" <<endl;
	char str[80];
        cin>>str;               //клиент вводит директорию "C:\\";
	LPCTSTR t=L"C:\\";
	LPCTSTR s=(LPCTSTR) str;
	
	if(DirExists(t))
	  cout<<"OK" <<endl;  //выводит NO
	else
      cout<<"No" <<endl;
    if(DirExists(s))
	  cout<<"OK" <<endl;  //выводит OK
	else
      cout<<"No" <<endl;

	int n;
	cin>>n;
	return 0;
}
m_Sla
Дата: 29.07.2015 05:44:20
https://msdn.microsoft.com/en-us/library/windows/desktop/dd319072(v=vs.85).aspx

Про работу с Unicode читай Джеффри РИХТЕР "Windows для профессионалов. Создание эффективных Win32-пpилoжeний с учетом специфики 64-разрядной версии Windows"
MasterZiv
Дата: 30.07.2015 04:58:34
m_Sla,

тут проблема вовсе не в этом, а в том, что в Windows в консоли используется кодировка не ansi, а oem,т.е. Не cp1251 а cp866, нужно преводить или установить в консоли нужную кодировку через chcp.
m_Sla
Дата: 30.07.2015 06:26:32
...
	char str[80];
        cin>>str;               //клиент вводит директорию "C:\\";
	LPCTSTR t=L"C:\\";
	LPCTSTR s=(LPCTSTR) str;
...
MasterZiv,
LPCTSTR у него указатель на юникоидную строку. А вместо юникоидной ТС "подсовывает" анси строку.
Думаешь дело только в кодировке консоли?
MasterZiv
Дата: 30.07.2015 08:03:01
m_Sla
...
	char str[80];
        cin>>str;               //клиент вводит директорию "C:\\";
	LPCTSTR t=L"C:\\";
	LPCTSTR s=(LPCTSTR) str;
...
MasterZiv,
LPCTSTR у него указатель на юникоидную строку. А вместо юникоидной ТС "подсовывает" анси строку.
Думаешь дело только в кодировке консоли?


Все правильно, я просто это вчера уже не успел написать, заснул.
Тут надо макрос T () использовать.
Ну и вся программа должна быть немного поправлена.
MasterZiv
Дата: 30.07.2015 08:37:11
Вот как надо:

#include "stdafx.h"
#include <tchar.h>
#include <windows.h>
#include <stdio.h>
#include <stdlib.h> 
#include <iostream>
#include <fstream>

using namespace std;

bool DirExists(LPCTSTR dir)
{
  DWORD code = GetFileAttributes(dir);
  return code != 0xFFFFFFFF && (FILE_ATTRIBUTE_DIRECTORY & code) != 0;
}

int _tmain(int argc, _TCHAR* argv[])
{
	cout<<"vvedite put" <<endl;
	TCHAR str[80];
        cin>>str;               //клиент вводит директорию "C:\\";
	LPCTSTR t=_T("C:\\");
	
	if(DirExists(t))
	  cout<<"OK" <<endl;  //выводит NO
	else
      cout<<"No" <<endl;
    if(DirExists(str))
	  cout<<"OK" <<endl;  //выводит OK
	else
      cout<<"No" <<endl;

	cin.get();
	return 0;
}
MasterZiv
Дата: 30.07.2015 09:09:43
но на самом деле надо ещё cin cout переопределить на базированный на TCHAR.
И кодировку поставить.