Форум 29 кафедры

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Форум 29 кафедры » IT Вопросы, Ответы » Технология программирования


Технология программирования

Сообщений 31 страница 40 из 40

31

Если вы действительно писали нормальные программы, то никаких проблем с переносом быть не должно. Ваши наработки оставляйте тут.

Кроме того, для работы программы необходимо создавать каталог C: //RT-11. Иначе .dsk файл диска некуда будет создавать.

Выкладываю откомпилированный файл http://slil.ru/23521775

0

32

FORMAT:
0x01000001 Некорректный размер диска (в блоках)
0x01000002 Некорректная версия системы
0x01000003 Некорректное имя тома
0x01000004 Некорректное имя владельца
0x01000005 Некорректное название системы
DIRDIR:
0x02000001 Некорректное имя диска
DIRSPC
0x02000001 Некорректное имя диска
CREATE
0x04000001 Некорректное имя файла
0x04000002 Некорректный тип файла
0x04000003 Недостаточно ресурсов для создания файла
0x04000004 Файл с таким именем и типом уже существует
ERASEF
0x04000001 Некорректное имя файла
0x05000004 Файл защищен от удаления. Файл не может быть удален
RENAME
0x06000001 Некорректное исходное имя
0x06000002 Некорректное новое имя
ADDNEW
0x04000001 Некорректное имя файла
0x07000002 Попытка записи слишком большого блока
WRITEF
0x04000001 Некорректное имя файла
0x07000002 Попытка записи слишком большого блока
ARCHVE
0x02000001 Некорректное имя диска
SETATR
0x0A000001 Некорректная новая дата создания
0x0A000003 Некорректный новый тип файла
MARKAT
0x01000003 Некорректное имя тома
0x01000004 Некорректное имя владельца
0x01000005 Некорректное название системы

0x00000000 Нет ошибки

0

33

Piff написал(а):

Значит так. Корректным считается имя файла длиной не более 6 символов, в состав имени входят все буквы латинского алфавита, цифры и знак подчеркивания. Тоже самое относится к типу файла, только длина его не превышает 4 символа.

Если не сложно и если еще не поздно, то просьба оставить это как есть.

0

34

#include "windows.h" // Для настройки консольного выходного буфера
#include <iostream>
#include "string.h" // C- функции обработки C-строк

using namespace std;       

//Объявления служебных функций и глобальных переменных
HANDLE hFile;
char * lpszFileName="ffile1";
unsigned int dwError=0x00000000; //Код ошибки
char * lpParam[5];        //Параметры
char lpszInfo[512];        //Информация (для команд ADDNEW и WRITEF)
char lpszCom[7];        //Команда
DWORD dwSize(0);
DWORD dwFree(0);

void FORMAT()
{
int nsize=atoi(lpParam[0]);
if (strcmp(lpParam[4],"RT-11"))
{
    dwError=0x01000005;
    return;
}
if ((nsize<=69)|(nsize>9999))
{
    dwError=0x01000001;
    return;
}
hFile=CreateFile(L"C:\\RT-11\\ffile1.dsk",GENERIC_READ|GENERIC_WRITE,NULL,NULL,CREATE_ALWAYS,NULL,NULL);
const int nbsize=nsize*512;
char tilda=126;
char * lpBuff=new char[nbsize];
int i=0;
DWORD dwWritten=0;
for(;i<nbsize;i++)
    lpBuff[i]=tilda;
WriteFile(hFile,lpBuff,nbsize,&dwWritten,0);
SetFilePointer(hFile,982,NULL,FILE_BEGIN);
int nver=atoi(lpParam[1]);
if ((nver<=0)|(nver>99))
{
    dwError=0x01000002;
    return;
}
WriteFile(hFile,&nver,2,&dwWritten,0);
strncpy(lpBuff,lpParam[2],12);
SetFilePointer(hFile,984,NULL,FILE_BEGIN);
WriteFile(hFile,lpBuff,12,&dwWritten,0);
strncpy(lpBuff,lpParam[3],12);
SetFilePointer(hFile,996,NULL,FILE_BEGIN);
WriteFile(hFile,lpBuff,12,&dwWritten,0);
strncpy(lpBuff,lpParam[4],12);
SetFilePointer(hFile,1008,NULL,FILE_BEGIN);
WriteFile(hFile,lpBuff,12,&dwWritten,0);

//making the free-space file and first catalogue

int blf=2;
SetFilePointer(hFile,3074,NULL,FILE_BEGIN);
WriteFile(hFile,&blf,2,&dwWritten,0);
blf=1;
SetFilePointer(hFile,3076,NULL,FILE_BEGIN);
WriteFile(hFile,&blf,2,&dwWritten,0);
blf=68;
SetFilePointer(hFile,3080,NULL,FILE_BEGIN);
WriteFile(hFile,&blf,2,&dwWritten,0);
char * filename="freesp";
char * type=".xyz";
blf=10;
SetFilePointer(hFile,3082,NULL,FILE_BEGIN);
WriteFile(hFile,&blf,2,&dwWritten,0);
SetFilePointer(hFile,3084,NULL,FILE_BEGIN);
WriteFile(hFile,filename,6,&dwWritten,0);
SetFilePointer(hFile,3090,NULL,FILE_BEGIN);
WriteFile(hFile,type,4,&dwWritten,0);
blf=nsize-68;
DWORD freespc=blf;
SetFilePointer(hFile,3090,NULL,FILE_BEGIN);//Свободное место, используются слова 5-6
WriteFile(hFile,&freespc,4,&dwWritten,0);
blf=0x6460;
SetFilePointer(hFile,3096,NULL,FILE_BEGIN);
WriteFile(hFile,&blf,2,&dwWritten,0);
blf=40;
SetFilePointer(hFile,3098,NULL,FILE_BEGIN);
WriteFile(hFile,&blf,2,&dwWritten,0);
CloseHandle(hFile);

}
void DIRDIR(){}
void DIRSPC()
{
DWORD dwWritten;

dwSize=0;
dwFree=0;
DWORD curfsize=0;
char addr[50];
sprintf(addr,"C:\\RT-11\\%s.dsk",lpszFileName);
if (!strcmp(lpszFileName,lpParam[0]))
{
    hFile=CreateFileA(addr,GENERIC_READ|GENERIC_WRITE,NULL,NULL,OPEN_ALWAYS,NULL,NULL);
    char system[12];
    SetFilePointer(hFile,1008,NULL,FILE_BEGIN);
    ReadFile(hFile,system,12,&dwWritten,0);
    if (strcmp(system,"RT-11"))
    {
    dwError=0x01000005;
    return;
    }
    SetFilePointer(hFile,3082,NULL,FILE_BEGIN);
    ReadFile(hFile,&curfsize,2,&dwWritten,0);
    while (curfsize!=40)
    {
    if (curfsize==10)
    {
        SetFilePointer(hFile,6,NULL,FILE_CURRENT);
        ReadFile(hFile,&curfsize,4,&dwWritten,0);
        dwFree+=curfsize;
        dwSize+=curfsize;
        SetFilePointer(hFile,4,NULL,FILE_CURRENT);
    }
    else
    {
        SetFilePointer(hFile,10,NULL,FILE_CURRENT);
        ReadFile(hFile,&curfsize,2,&dwWritten,0);
        dwSize+=curfsize;
        SetFilePointer(hFile,2,NULL,FILE_CURRENT);
    }

    ReadFile(hFile,&curfsize,2,&dwWritten,0);
    }
}
else
{
    dwError=0x02000001;
}
CloseHandle(hFile);

}
void CREATE(){}
void ERASEF(){}
void RENAME(){}
void ADDNEW(){}
void WRITEF(){}
void ARCHVE(){}
void SETATR(){}
void MARKAT()
{

}

int main()
{

int i=0;
for(;i<5;i++)
{
    lpParam[i]=new char[20];
}
int counter=1;
//Настраиваем выходной буфер консоли (цвет текста ярко-красный)

HANDLE hStdOut;
hStdOut=GetStdHandle(STD_OUTPUT_HANDLE); //Получаем дескриптор выходного буфера консоли
WORD wAttribute=FOREGROUND_RED|FOREGROUND_INTENSITY;
SetConsoleTextAttribute(hStdOut,wAttribute);

//Обрабатываем входящие
char lpszBuff[526];
cout<<"RT-11 K5292 MODEL\nWAITING FOR COMMANDS. PRESS Q AND ENTER TO QUIT.\n";
while (true)
{
    cin.getline(lpszBuff,526);        //Строка, напечатанная оператором, заносится в буфер
    if((lpszBuff[0]=='Q')||(lpszBuff[0]=='q')) //В случае команды выхода
    {
        return 0;
    }
    cout<<lpszBuff<<endl;
    int j=0;
    i=0;
    counter=1;
    int shift=7;
    strncpy(lpszCom,lpszBuff,6);    //Вычленяем команду
    lpszCom[6]='\0';
    int x=strcmp(lpszCom,"FORMAT");
    int bx,by;
    if (((strcmp(lpszCom,"FORMAT"))&&(strcmp(lpszCom,"DIRDIR"))&&(strcmp(lpszCom,"DIRSPC"))&&(strcmp(lpszCom,"CREATE"))&&(strcmp(lpszCom,"ERASEF "))&&(strcmp(lpszCom,"RENAME"))&&((bx=strcmp(lpszCom,"ADDNEW")))&&((by=strcmp(lpszCom,"WRITEF")))&&(strcmp(lpszCom,"ARCHVE"))&&(strcmp(lpszCom,"SETATR"))&&(strcmp(lpszCom,"MARKAT")))) //Проверяем корректность введенной команды
    {
    cout<<"Bad command\n";
    continue;
    }
    if ((!bx)||(!by))            //Если используются команды ADDNEW и WRITEF
    {
    strncpy(lpszInfo,&lpszBuff[7],512);
    }
    else
    {
    cout<<"Command: "<<lpszCom<<endl; //Заполняем параметры
    i=7;
    while (lpszBuff[i]!='\0')
    {

        while (lpszBuff[i]!=' ')
        {
        if (lpszBuff[i]=='\0')
        {
            (lpParam[j])[i-shift]='\0';
            break;
        }
        (lpParam[j])[i-shift]=lpszBuff[i];
        i++;
        }
        if (lpszBuff[i]=='\0')
        break;
        (lpParam[j])[i-shift]='\0';
        i++;
        shift+=strlen(lpParam[j])+1;
        j++;
        counter++;
    }
    }
    if (!strcmp(lpszCom,"FORMAT"))    //Вызываем служебные функции
    FORMAT();
    if (!strcmp(lpszCom,"DIRDIR"))
    DIRDIR();
    if (!strcmp(lpszCom,"DIRSPC"))
    {
    DIRSPC();
    cout<<"Free Space:\n"<<512*dwFree<<endl;
    cout<<"Total Useful Space:\n"<<512*dwSize<<endl;
    }
    if (!strcmp(lpszCom,"CREATE"))
    CREATE();
    if (!strcmp(lpszCom,"ERASEF"))
    ERASEF();
    if (!strcmp(lpszCom,"RENAME"))
    RENAME();
    if (!strcmp(lpszCom,"ADDNEW"))
    ADDNEW();
    if (!strcmp(lpszCom,"WRITEF"))
    WRITEF();
    if (!strcmp(lpszCom,"ARCHVE"))
    ARCHVE();
    if (!strcmp(lpszCom,"SETATR"))
    SETATR();
    if (!strcmp(lpszCom,"MARKAT"))
    MARKAT();
wAttribute=FOREGROUND_BLUE|FOREGROUND_INTENSITY; //Устанавливаемый синий цыет выводимого текста
SetConsoleTextAttribute(hStdOut,wAttribute);
    switch(dwError)                //Анализируем ошибку
    {
    case 0x00000000:
        cout<<"No error\n";
        break;
    case 0x01000001:
        cout<<"Incorrect size of the disk error\n";
        break;
    case 0x01000002:
        cout<<"Incorrect system version error\n";
        break;
    case 0x01000003:
        cout<<"Incorrect volume error\n";
        break;
    case 0x01000004:
        cout<<"Incorrect owner's name error\n";
        break;
    case 0x01000005:
        cout<<"Incorrect system name error\n";
        break;
    case 0x02000001:
        cout<<"Incorrect disk name error\n";
        break;
    case 0x04000001:
        cout<<"Incorrect file name error\n";
        break;
    case 0x04000002:
        cout<<"Incorrect file type error\n";
        break;
    case 0x04000003:
        cout<<"Not enough resources error\n";
        break;
    case 0x06000001:
        cout<<"Incorrect new file name error\n";
        break;
    case 0x06000002:
        cout<<"Incorrect old file name error\n";
        break;
    case 0x07000002:
        cout<<"Info too long error\n";
        break;
    case 0x09000001:
        cout<<"Incorrect archieve name error\n";
        break;
    case 0x0A000001:
        cout<<"Incorrect new data error\n";
        break;
    case 0x0A000002:
        cout<<"Incorrect new file name error\n";
        break;
    case 0x0A000003:
        cout<<"Incorrect new file type name error\n";
        break;
    default:
        cout<<"Unknown error\n";
    }
    if ((!bx)||(!by))            //Ввыеденные оператором параметры выводятся на экран
    {
    cout<<"Inserted info: \n";
    cout<<lpszInfo<<endl;
    }
    else
    {
    cout<<"Inserted parameters: "<<endl;
    for (i=0;i<counter;i++)
        cout<<lpParam[i]<<endl;
    }
    wAttribute=FOREGROUND_RED|FOREGROUND_INTENSITY;    //Возвращаем красный текст выходного текста
    SetConsoleTextAttribute(hStdOut,wAttribute);
    for(int k=0;k<5;k++)
    {
    ZeroMemory(lpParam[k],20);
    }
}
return 0;

}

0

35

Общая программа. ваша задача - вести соотвествие своих методов с общим кодом. нет соответствия -код пишете не вы. но документацию придется менять

0

36

Сняты, похоже, все вопросы с Nik@rus'ом. Остальные пока не шевелятся.

0

37

у меня было вот это но там коды ошибок другие и нет проверки названия ФС
void MARKAT( char* Name,char* chUser)  //Name-имя тома ,chUser – имя                                                                         //владельца
{
bool flag=true;   //флаг существования ошибки
if (strlen(Name)>12)   //проверка длины имени тома
{
    cout<<"Too many symbols! Please, reenter this parameter.\n";
          Error=0x0B000001;
          flag=true;
}
    else flag=false;
    for(int i=0;i<strlen(Name);i++)//проверка на запрещенные символы
{
if (Name[i]=='*'||'?'||'/'||'|'||'.'||','||';'||':'||'+'||'='||'['||']'||'<'||'>'||' " ')
    {
    cout<<"Forbidden symbols! Please, reenter this parameter.\n";
          Error=0x0B000001;
          flag=true;
    }
      else flag=false;
     };
     flag=true;
     if (strlen(chUser)>=12)  // проверка длины имени владельца
          {
          cout<<"Too many symbols! Please, reenter this parameter.\n";
          Error=0x0B000002;
          flag=true;
           }
      else flag=false;
   for(int i=0;i<strlen(chUser);i++)//проверка на запрещенные символы
       {
  if (chUser[i]=='*'||'?'||'/'||'|'||'.'||','||';'||':'||'+'||'='||'['||']'||'<'||'>'||'"')
    {
    cout<<"Forbidden symbols! Please, reenter this parameter.\n";
          Error=0x0B000002;
          flag=true;
    }
       else flag=false;
        };
    if(!flag) // если не произошло ошибки
     {
ofstream fout;       //объект типа ofstream
fout.open("data",ios::in | ios::binary); //открываем файл для записи
fout.seekp(984,ios_base::beg); // находим 472 байт в блоке №1
fout.write((char*) Name, sizeof Name); //записываем имя тома
fout.seekp(12,ios_base::cur); // находим 484 байт в блоке №1
fout.write((char*) chUser, sizeof chUser);//записываем имя               //владельца   
fout.close();//закрываем файл
cout<<"Operation completed successfully";
};

}

0

38

Значит так. теперб монитор у нас умеет устанавливать текущий рабочий диск, функции под это тоже подогнаны. Команда SETDSK dsk_name, где dsk_name - имя диска (до 6 символов)

Как я напишу в ТЗ.

ФС способна работать одновременно с несколькими дисками. Для установления текущего рабочего диска требуется вызвать команду SETDSK dsk_name, где dsk_name - имя диска (до 6 символов). Все команды работают с текущим рабочим диском, причем статистические команды, имеющие его в качестве параметра (DIRDIR, DIRSPC), а также служебная команда ARCHVE,  должны указывать имя текущего диска в явном виде (этот параметр для них проверяется, так как выведение информации и статистики о нерабочем диске может привести к ошибкам оператора, который может ошибиться и использовать в планировании работы с активным диском ФС информацию о неактивированном диске, а использование команды ARCHVE привеод к изменению структуры диска, и его случайное применение к неактивному диску может быть нежелательным).
Внимание. Установка в качестве рабочего диска ранее неиспользованного обуславливает необходимость первичного форматирования диска. Иначе работа с ФС невозможна.

0

39

ссылка в тему...я извиняюсь, но не смог прикрепить сюда (нелепый движок форума)

http://slil.ru/23575487

0

40

У меня только 1 вопрос, точнее пожелание: выложите окончательные коды ошибок!!!!

0


Вы здесь » Форум 29 кафедры » IT Вопросы, Ответы » Технология программирования