Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторная работа №2 Вариант 11.doc
Скачиваний:
22
Добавлен:
20.06.2014
Размер:
156.67 Кб
Скачать
  1. Экспериментальные результаты

Результатом выполнения лабораторной работы является программа на языке С/C++, которая представляет собой полноценный интерпретатор командной строки с возможностью перенаправления стандартного ввода/вывода. Программный текст разделен на две функции: функцию main, выполняющую основную работу по получению команды пользователя и ее обработке, и функцию DeleteFiles, которая выполняет поиск заданного пользователем слова в заданных им же файлах и удаляет по его требованию те из них, где это слово встретилось больше заданного количества раз. (функция реализована согласно варианту).

    1. Листинг программы

#include "stdafx.h"

#include <windows.h>

#include <locale.h>

#include <conio.h>

#include <io.h>

#include <fcntl.h>

void DeleteFiles(int argc, WCHAR **params);

int _tmain()

{

setlocale(LC_ALL,"Russian");

WCHAR Start_String[256], **parsed_string;

HANDLE console, file;

int oldDescr,newDescr;

bool output_file = false;

DWORD fact, argc;

STARTUPINFO si;

PROCESS_INFORMATION pi;

for(;;)

{

argc = 1;

printf("\n$");

fflush(stdout);

console = GetStdHandle(STD_INPUT_HANDLE);

ReadConsole(console,Start_String,256,&fact,NULL);

Start_String[fact-2]='\0';

for(DWORD i=0;i<wcslen(Start_String);i++)

if(Start_String[i]==' ') argc++;

if(!wcscmp(Start_String,L"exit"))

{

CloseHandle(console);

return 0;

}

parsed_string = (WCHAR **)malloc(sizeof(WCHAR *)*argc);

for(DWORD i=0;i<argc;i++)

{

parsed_string[i] = (WCHAR *)malloc(sizeof(WCHAR)*64);

memset(parsed_string[i],'\0',64);

}

for(DWORD k=0,i=0,j=0;k<wcslen(Start_String);k++)

{

if(Start_String[k]!=' ')

{

parsed_string[i][j] = Start_String[k];

j++;

}

else

{

j=0; i++;

}

}

if(!wcscmp(parsed_string[argc-1],_T("-f")))

{

file = CreateFile(_T("output.txt"), GENERIC_WRITE,0,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,0);

console = GetStdHandle(STD_OUTPUT_HANDLE);

SetStdHandle(STD_OUTPUT_HANDLE, file);

oldDescr = _dup(1);

newDescr = _open_osfhandle((intptr_t)file, _O_APPEND );

_dup2(newDescr, 1);

output_file = true;

}

if(!wcscmp(parsed_string[0],_T("delfiles")))

DeleteFiles(argc,parsed_string);

else

{

ZeroMemory(&si, sizeof(STARTUPINFO));

ZeroMemory(&pi, sizeof(PROCESS_INFORMATION));

if(CreateProcess(NULL, Start_String, NULL, NULL, TRUE, NULL, NULL, NULL, &si, &pi))

{

WaitForSingleObject(pi.hProcess, 200);

CloseHandle(pi.hProcess);

CloseHandle(pi.hThread);

}

else _tprintf(L"\"%s\" не является внутренней или внешней\nкомандой, исполнямой программой или пакетным файлом\n",parsed_string[0]);

}

fflush( stdout );

if(output_file)

{

CloseHandle(file);

SetStdHandle(STD_OUTPUT_HANDLE, console);

_dup2(oldDescr, 1 );

output_file = false;

}

memset(Start_String,'\0',256);

free(parsed_string);

}

}

void DeleteFiles(int argc, WCHAR **params)

{

HANDLE fp;

DWORD fact, count, kolvo_vh;

CHAR Buffer[256];

wint_t ch;

DWORD search_word_length;

if(argc < 5 || argc > 11){

printf("Неверное количество параметров. Попробуйте снова\n");

return;

}

search_word_length = wcslen(params[1]);

DWORD k = _wtoi(params[argc-2]);

for(int i=2;i<(argc-2);i++)

{

fp = CreateFile(params[i],GENERIC_READ,0,NULL,OPEN_EXISTING,0,NULL);

if(fp == INVALID_HANDLE_VALUE) {

printf("Ошибка открытия файла %ws. Возможно, такой файл не существует в данной директории.\n",params[i]);

return;

}

memset(Buffer,'\0',256);

ReadFile(fp,Buffer,256,&fact,NULL);

kolvo_vh = count = 0;

for(unsigned int j=0;j<fact;j++)

{

if(Buffer[j]!=params[1][count])

{

count = 0;

continue;

}

count++;

if((count+1) == search_word_length)

{

count = 0;

kolvo_vh++;

}

}

if(kolvo_vh > k)

{

printf("Файл %ws содержит более %d вхождений слова %ws. Удалить его? (y/n)\n",params[i],k,params[1]);

do{

ch = getwchar();

switch(ch){

case 'y':

CloseHandle(fp);

DeleteFile(params[i]);

printf("Файл %ws успешно удален.\n",params[i]);

break;

case 'n':

printf("Файл %ws не будет удален по Вашему требованию.\n",params[i]);

CloseHandle(fp);

break;

default:

printf("Введите либо 'y', либо 'n' (без кавычек).\n");

}

}while(ch != 'y' && ch != 'n');

}

else

{

printf("Файл %ws содержит %d вхождений слова %ws. Он не требует удаления.\n",params[i],kolvo_vh,params[1]);

CloseHandle(fp);

}

}

}