Я пытаюсь реализовать программу, которая распознает атрибуты файла Windows. У меня есть код, но иногда я получаю ошибку кучи после прохождения возврата в основном блоке. Спасибо за внимание и помощь!
#include "stdafx.h"
#include <Windows.h>
#include <conio.h>
_TCHAR* getStringAttributes(int value, _TCHAR* str[])
{
DWORD d = GetFileAttributes(str[value]);
_TCHAR* temp;
switch(d)
{
case 2048: temp = L"Compressed\n"; break;
case 32: temp = L"Archive\n"; break;
case 16: temp = L"Directory\n"; break;
case 16384: temp = L"Encrypted\n"; break;
case 2: temp = L"Hidden\n"; break;
case 128: temp = L"Normal\n"; break;
case 1: temp = L"Readonly\n"; break;
case 4: temp = L"System\n"; break;
case 256: temp = L"Temporary\n"; break;
default: temp = L"Error or unsupported attribute\n"; break;
}
return temp;
}
int _tmain(int argc, _TCHAR* argv[])
{
_TCHAR* attString = new _TCHAR();
char* ynAnswer = new char();
if(argv[1] == NULL)
{
printf("%s\n","You didn't type file path. Try again?[Y/N]");
gets_s(ynAnswer,10);
if(*ynAnswer == 'y' || *ynAnswer == 'Y')
{
printf("%s\n","Type in a path to the file");
argv[1] = new _TCHAR();
_getws(argv[1]);
if(argv[1] != L"")
{
printf("%s","Attribute: ");
attString = getStringAttributes(1,argv);
_tprintf(attString);
printf("%s","for\n");
_tprintf(argv[1]);
}
}
}
else
{
printf("%s","Attribute: ");
attString = getStringAttributes(1,argv);
_tprintf(attString);
}
printf("%s","Goodbye");
getch();
delete[] ynAnswer;
delete[] attString;
return 0;
}
вы вводите целую строку в строки 1 или 2 байта. Эти распределения:
_TCHAR* attString = new _TCHAR();
char* ynAnswer = new char();
Выделите только 1 массив элементов.
должен быть:
_TCHAR* attString = new _TCHAR[MAX_SIZE];
char* ynAnswer = new char[MAX_SIZE];
Когда MAX_SIZE
должен быть отключен как макрос.
еще лучше использовать:
wstring attString ;
string ynAnswer;
wcin>> attString;
cin>> ynAnswer;
Еще проблема заключается в распределении в строке:
argv[1] = new _TCHAR();
в дополнение к предыдущей ответной проблеме, в этой строке argv[1]
может даже не существовать. Вы должны ввести другой буфер.
это может быть так:
wstring argv1;
if(argc <2){
wcin>>argv1;
}else{
argv1=argv[1];
}
теперь используйте argv1
вместо argv[1]
Еще кое-что:
Вы используете _TCHAR
как WCHAR
.
при использовании строк _TCHAR
следует декальтироваться как:
_T("some string")
не как:
L"some string"
.
attString
иynAnswer
достаточно памяти для одного символа, поэтому выynAnswer
кучу.