Атрибут
|
Предназначение
|
FILE_ATTRIBUTE_ARCHIVE
|
FILE_ATTRIBUTE_DIRECTORY
|
Дескриптор идентифицирует каталог.
|
FILE_ATTRIBUTE_HIDDEN
|
Файл или каталог скрытые.
|
FILE_ATTRIBUTE_READONLY
|
Файл или каталог только для
чтения.
|
FILE_ATTRIBUTE_SYSTEM
|
Файл или каталог системные.
|
§ ftLastWriteTime
Структура FILETIME. Для файла, структура устанавливает, когда последний
раз была запись в файл, он обрезался или переписывался (например функциями
WriteFile или SetEndOfFile). Эта дата и время не обновляются тогда, когда
атрибуты файла или дескрипторы безопасности изменяются. Для каталога, структура
определяет, когда каталог создавался. Если лежащая в основе файловая система не
поддерживает последнее время записи, этот член структуры равняется нулю.
§ nFileSizeHigh
Старшее двойное слово (DWORD) значения размера файла, в байтах. Это
значение равняется нулю, если размер файла не больше, чем определяет его
MAXDWORD.
§ nFileSizeLow
Младшее двойное слово (DWORD) значения размера файла, в байтах.
§ cFileName
Символьная строка с нулем в конце, которая устанавливает имя файла.
Для того, чтобы копировать, перемещать, переименовывать или удалять файлы
в среде Windows на языке C++ существует функция SHFileOperation, но для ее реализации, нужна
структура SHFILEOPSTRUCT, которая имеет следующий синтаксис: typedef struct _SHFILEOPSTRUCT {
HWND hwnd;wFunc;pFrom;pTo;_FLAGS
fFlags;fAnyOperationsAborted;hNameMappings;lpszProgressTitle;
} SHFILEOPSTRUCT, *LPSHFILEOPSTRUCT;
5. Разработка
программного продукта
Прежде всего, стоит начать с того, что программный продукт разрабатывался
как консольное приложение, то есть без графических элементов.
Мое приложение состоит из 8 функций (включая главную - int_main) и 1 класс. Функции следующие:
· enum ConsoleColor и void SetColor - отвечают за изменение текста в консоли . Функция ConsoleColor служит для удобной смены цвета, а SetColor устанавливает цвет, благодаря
SetConsoleTextAttribute().
· DWORDLONG gfs - эта функция, определяет размер файла или папки,
используя структуру WIN32_FIND_DATA и функцию FindFirstData(), путем сложения (nFileSizeHigh * (MAXDWORD+1)) + nFileSizeLow.
· void MoveFolder - данная функция перемещает файлы,
либо переименовывает их. Она использует структуру SHFILEOPSTRUCT и функцию SHFileOperation, в которую
она передает в параметр wFunc
- FO_MOVE (переместить/переименовать объект), в pFrom - путь до объекта, в pTo - путь, в который следует
переместить/переименовать объект.
· bool DirExists - следующая функция возвращает логическую
единицу, если указанная директория или файл существуют.
· wchar_t* un - функция, которая возвращает имя пользователя
компьютера. В ее основе лежит функция GetUserName();
· bool IfFileExistsAndIsNotEmpty - как видно по названию,
функция определяет пуст ли файл. В ее основе лежит функция GetFileAttributesW().
Класс outclass был создан с целью организовать
вывод команд в файл. Данный
класс имеет 2 метода: startout(string filname) и endout().
Первый метод отвечает за создание файла, и перенаправление вывода в него. Также
стоит отметить, что в качестве аргумента передается название файла. Второй
метод служит для прекращения вывода в файл, и восстановления вывода на экран.
При первом запуске, изменяется цвет консоли, и изменяется кодировка для
поддержки и правильного отображения кириллицы(используя chcp). Потом с помощью функции SetCurrentDirectory(), в программе устанавливается
домашняя директория. После, инициализируется объект класса outclass и вектор строк (типа string), в который будет заноситься каждое
слово, что введется в качестве команды в терминал.
Все меню программы основано на бесконечном цикле while, условие выхода из которого следующее: если
пользователь введет exit, то мы выйдем
из цикла и следовательно программа завершится, в других же случаях либо
запустится нужный нам участок кода (ls, cd, cat, comm,
и т.д.), если первый элемент вектора строк совпадет с названием команды, либо
выдаст сообщение об ошибке, в котором будет сказано, что данной программы не
существует. В начале цикла выводится строка, в которой обозначен путь текущей
директории и имя пользователя системы, как в системе OC Linux. Именно сюда, нам и предлагается ввести команду.
После выполнения того или иного участка кода, который отвечает за команду,
выполняется оператор continue, что перебрасывает нас в самое начало цикла.
Заключение
unix программный эмулятор windows
В результате выполнения курсовой работы была изучена файловая система ОС Unix, ее структура и работа основных
команд, к которым относятся ls, cmp, comm, а также их ключей. Кроме того изучена работа аналогов
этих команд в среде Windows. Затем
разработан эмулятор работы командного процессора ОС Unix в среде ОС Windows. Он включал в себя следующие команды:
- ls вывод списка файлов.
- Cmp побайтное сравнение двух файлов
- Comm сравнение строк в файлах.
- Cat вывод или конкатенация файлов.
- Cd установление директории.
- Wc подсчет количества строк, слов и символов в файле.
- Mv переименование или перемещение файлов.
- Man справочное руководство.
В качестве средства реализации выбран язык c++, в среде MS Visual Studio, так как его возможности идеально подходят в качестве
решения.
Список литературы
1. Николенко Д. В. Самоучитель по Visual C++. -СПб :
Наука и техника, 2001. -368 с.
. Уэйт М. , Прата С. , Мартин Д. Язык Си. Руководство
для начинающих. - М. : Мир, 1988. -512с.
. Савич У. С++ во всей полноте. - К. : BHV; СПб:
Питер, 2005. 784 с.
Приложение
#include "stdafx.h"
#include <iostream>
#include <string>
#include <locale>
#include <iomanip>
#include <fstream>
#include <conio.h>
#include <Windows.h>
#include <vector>
#include <sstream>
#include <Lmcons.h>namespace std;* buffer=new
char[MAX_PATH];outclass
{:*x; ofstream f;:startout(string filename)
{f.open(filename); x = cout.rdbuf( f.rdbuf()); }endout(){
cout.rdbuf(x); }
};ConsoleColor
{= 0, Blue = 1, Green = 2, Cyan = 3, Red = 4, Magenta = 5,=
6, LightGray = 7, DarkGray = 8, LightBlue = 9, LightGreen = 10,LightCyan = 11,
LightRed = 12 LightMagenta = 13, Yellow = 14, White = 15
};SetColor(ConsoleColor text, ConsoleColor background)
{ HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);(hStdOut,
(WORD)((background << 4) | text));
}gfs(wchar_t* ta)
{_t* u = ta;Handle;_FIND_DATA FindData;Result=0;=
FindFirstFile(u, &FindData);(Handle == INVALID_HANDLE_VALUE){ return 0;}
{(wcscmp(FindData.cFileName,L".") != 0 &&
wcscmp(FindData.cFileName,L"..") != 0)(FindData.dwFileAttributes
& FILE_ATTRIBUTE_DIRECTORY)
{
}= Result + ((DWORDLONG)FindData.nFileSizeHigh<<32) +
FindData.nFileSizeLow;
}while(FindNextFile(Handle, &FindData) !=
0);(Handle);Result;
{fos = {0};.wFunc = FO_MOVE;.pFrom = pszFrom;.pTo = pszTo;
::SHFileOperation(&fos);
}DirExists( const wchar_t *fname )
{( fname == NULL || wcslen(fname) == 0 )
{false;
}dwAttrs = ::GetFileAttributesW( fname );( dwAttrs ==
DWORD(-1) )
{dLastError = GetLastError();( ERROR_TOO_MANY_NAMES ==
dLastError
|| ERROR_SHARING_VIOLATION == dLastError
|| ERROR_TOO_MANY_SESS == dLastError
|| ERROR_SHARING_BUFFER_EXCEEDED == dLastError )
{true;
}else
{false;
}
}true;
}_t* un()
{_t name[600];sz=sizeof(name);(name,&sz);name;
}IfFileExistsAndIsNotEmpty( string fPath )
{str[255];file_re; file_re.open( fPath.c_str() );( ! file_re
) { return false; }( ! file_re.getline( str, sizeof(str) ).eof() ) { return
true; }false;
}_tmain(int argc, _TCHAR* argv[])
{( "color 0A" ); setlocale(LC_ALL,
"Russian");("chcp 1251");
system("cls");(L"c:\\vlad");_FIND_DATA FindFileData; HANDLE
hf; SYSTEMTIME st;path;s2;_t t[100]={0};was=false;<string> vs;(1)
{.clear();=false;(MAX_PATH,buffer);(buffer,
buffer);bufcom[256];sizecom =
256;(bufcom,&sizecom);out_file;<<un()<<"@"<<bufcom<<":/"<<buffer<<"~$
";(cin,path);(path.empty()) { continue;}ss;.str(path);(ss>>s2)
vs.push_back(s2);(path=="exit") {return 0;}(vs[0]=="cat")
{= true;(vs.size()==1) { cout<<"cat: не хватает операнда"<<endl; continue; }=true; string text; string
emp; string file; ofstream o;skey=false; bool cnc=false; bool err
=false;.erase(vs.begin());(int i=0; i<vs.size(); i++)
{ if(vs[i]=="-s") {skey=true; vs.erase(vs.begin() +
i);}}(int i=0; i<vs.size(); i++)
{(vs[i]==">")
{.erase(vs.begin() + i);(i>=vs.size())
{cout<<"bash:syntax error near unexpected token
'newline'"<<endl; err=true; continue;}{cnc=true; file =
vs[i].c_str(); vs.erase(vs.begin() + i); o.open(file);
o.close();o.open(file,std::ios::app);}
}
}(err==true) continue;(cnc==true)
{(int i=0;i<vs.size();i++)
{s(vs[i]);(!s) { cerr<<"cat:
"<<vs[0]<<": Нет такого файла или каталога"<<endl;
break;}(skey==true)
{(getline(s, text))
{(text.empty() && text == emp )
continue;<<text<<endl;=text;
}
}
{(getline(s, text))
{ o<< text << endl; }
}
};
}(int i=0;i<vs.size();i++)
{s(vs[i]);(!s) { cerr<<"cat:
"<<vs[0]<<": Нет такого файла или каталога"<<endl;
break;}(skey==true)
{(getline(s, text))
{(text.empty() && text == emp )
continue;<<text<<endl;=text;
}
}
{(getline(s, text))
{ cout << text << endl; }
}
};
}(vs[0]=="cd" )
{= true; wchar_t* cd = new wchar_t[MAX_PATH];(vs.size()==1) {
SetCurrentDirectory(L"c:\\vlad\\"); continue; }.erase(vs.begin());=
vs[0];(cd,path.c_str(),MAX_PATH);(SetCurrentDirectory(cd)==0)
{cout<<"Unknown file or
directory!"<<endl; ss.str().clear(); vs.clear();
continue;}.erase(vs.begin());(vs.size()>0)
{(int i=0; i<vs.size();i++)
{<<"cd: неизвестный операнд или ключ
'"<<vs[i]<<"' "<<endl;
};
}(cd);;
}(vs[0]=="man" )
{=true;c; bool ex = false; string text; string
file="";found=false;
if(vs.size()==1)
{string stranica; cout<<"Какая страница руководства вам нужна?"<<endl;
getline(cin,stranica); vs.push_back(stranica)
}.erase(vs.begin());(vs[0]=="ls" || vs[0]=="cmp" ||
vs[0]=="cat" || vs[0]=="wc" || vs[0]=="comm" ||
vs[0]=="cd" || vs[0]=="mv" )= true;(found == true
&& vs.size() == 1)
{=true; ifstream
f("c:\\vlad\\"+vs[0]);(White,Black);
system("cls");(getline(f, text)) cout<<text<<endl;(!f)
{= getch();(c==113) break;
}("cls"); SetColor(LightGreen,Black);
}(ex==false)
{error_nabor="";(int i=0; i<vs.size(); i++)
{ error_nabor= error_nabor + " " + vs[i];}
cout<<"Руководство по "<<error_nabor<<"
не найдено"<<endl;
continue;
};
}(vs[0]=="ls" )
{=true;.erase(vs.begin());mone = false; bool akey = false;
bool lkey = false; bool ckey = false; bool pkey = false;out =false;bool err=
false;o;polz[600];file;(polz,un(),600);(int i=0; i<vs.size(); i++)
{ if(vs[i]=="-a") {akey=true; vs.erase(vs.begin() +
i);}}(int i=0; i<vs.size(); i++)
{ if(vs[i]=="-l") {lkey=true; vs.erase(vs.begin() +
i);} }(int i=0; i<vs.size(); i++)
{ if(vs[i]=="-c") {ckey=true; vs.erase(vs.begin() +
i);}}(int i=0; i<vs.size(); i++)
{ if(vs[i]=="-p") {pkey=true; vs.erase(vs.begin() +
i);} }(int i=0; i<vs.size(); i++)
{(vs[i]==">")
{=true;.erase(vs.begin() + i);(i>=vs.size())
{ cout<<"bash:syntax error near unexpected token
'newline'"<<endl; ss.str().clear(); vs.clear(); continue;}
{ file = vs[i].c_str(); vs.erase(vs.begin() + i);
o.open(file); o.close();o.open(file,std::ios::app);}
}
}(vs.size()==0)
{strcat(buffer,"\\*"); mbstowcs(t, buffer, 100); }
{vs[0].push_back('*'); mbstowcs(t, vs[0].c_str(), 100);
vs.erase(vs.begin());}(vs.size()>0)
{(int i=0; i<vs.size();i++)
{<<"ls: неизвестный операнд или ключ
'"<<vs[i]<<"' "<<endl;
};
}=FindFirstFile(t,
&FindFileData);(hf==INVALID_HANDLE_VALUE)
{ wcout<<L"ls: невозможно получить доступ к
"<<t<<L": Нет такого файла или
каталога"<<endl; continue;}
if (hf!=INVALID_HANDLE_VALUE)
{(out!=true)<<buffer<<endl;c=0;
{(akey==false && (wcscmp(FindFileData.cFileName,
L".")!=1 || wcscmp (FindFileData.cFileName, L"..") !=1))
{;
}(!(FindFileData.dwFileAttributes &
FILE_ATTRIBUTE_DIRECTORY)) //если файл
{(lkey==true)
{(out==true)
{(FindFileData.dwFileAttributes &
FILE_ATTRIBUTE_ARCHIVE)<< L"arch
";(FindFileData.dwFileAttributes &
FILE_ATTRIBUTE_HIDDEN)<<L"hidden
";(FindFileData.dwFileAttributes &
FILE_ATTRIBUTE_SYSTEM)<<L"system ";(FindFileData.dwFileAttributes
& FILE_ATTRIBUTE_READONLY)<<L"readonly
";(&FindFileData.ftLastWriteTime,
&FindFileData.ftLastWriteTime);(FileTimeToSystemTime(&FindFileData.ftLastWriteTime,
&st) == TRUE)
{<< st.wDay << "-" << st.wMonth
<< "-"
<< st.wYear << " " << st.wHour
<< ":"
<< st.wMinute << ":" <<
st.wSecond << " ";
}<<setw(7)<<polz<<setw(10)<<FindFileData.nFileSizeHigh/1024.0*(MAXDWORD+1)
+
FindFileData.nFileSizeLow<<setw(26)<<FindFileData.cFileName<<endl;
}
{(FindFileData.dwFileAttributes &
FILE_ATTRIBUTE_ARCHIVE)<< "arch ";(FindFileData.dwFileAttributes
& FILE_ATTRIBUTE_HIDDEN)<<"hidden
";(FindFileData.dwFileAttributes &
FILE_ATTRIBUTE_SYSTEM)<<"system
";(FindFileData.dwFileAttributes &
FILE_ATTRIBUTE_READONLY)<<"readonly
";(&FindFileData.ftLastWriteTime, &FindFileData.ftLastWriteTime);(FileTimeToSystemTime(&FindFileData.ftLastWriteTime,
&st) == TRUE)
{<<st.wDay<<"-"<<st.wMonth<<"-"
<<st.wYear<<" "<< st.wHour<<
":"<<st.wMinute<<":"<<st.wSecond<<
" ";
}<<setw(7)<<un()<<setw(10)<<FindFileData.nFileSizeHigh/1024.0*(MAXDWORD+1)
+
FindFileData.nFileSizeLow<<setw(26)<<FindFileData.cFileName<<endl;
}
}
{(out==true)
{<<FindFileData.cFileName<<"
";(mone==true)
{<<endl;
}
}
{<<FindFileData.cFileName<<"
";(mone==true) { wcout<<endl;}
}
}
}
{(LightGray,Black);(lkey==true)
{(out==true)
{(FindFileData.dwFileAttributes &
FILE_ATTRIBUTE_ARCHIVE)<< "arch
";(FindFileData.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN)<<
"hidden ";(FindFileData.dwFileAttributes &
FILE_ATTRIBUTE_SYSTEM)<< "system ";(FindFileData.dwFileAttributes
& FILE_ATTRIBUTE_READONLY)<< "readonly
";(&FindFileData.ftLastWriteTime,
&FindFileData.ftLastWriteTime);(FileTimeToSystemTime(&FindFileData.ftLastWriteTime,
&st) == TRUE)
{<< st.wDay << "-" << st.wMonth
<< "-"
<< st.wYear << " " << st.wHour
<< ":"
<< st.wMinute << ":" <<
st.wSecond << " ";
}_t
tmp[100];(tmp,wcstok(t,L"*"));(tmp,FindFileData.cFileName);
wcscat(tmp,L"\\*");<<setw(7)<<polz<<setw(10)<<gfs(tmp)<<setw(26)<<FindFileData.cFileName<<endl;(LightGreen,Black);;
}
{(FindFileData.dwFileAttributes &
FILE_ATTRIBUTE_ARCHIVE)<< "arch
";(FindFileData.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN)<<
"hidden ";(FindFileData.dwFileAttributes &
FILE_ATTRIBUTE_SYSTEM)<< "system ";(FindFileData.dwFileAttributes
& FILE_ATTRIBUTE_READONLY)<< "readonly ";(&FindFileData.ftLastWriteTime,
&FindFileData.ftLastWriteTime);(FileTimeToSystemTime(&FindFileData.ftLastWriteTime,
&st) == TRUE)
{<< st.wDay << "-" << st.wMonth
<< "-"
<< st.wYear << " " << st.wHour
<< ":"
<< st.wMinute << ":" <<
st.wSecond << " ";
}_t tmp[100];(tmp,wcstok(t,L"*"));(tmp,FindFileData.cFileName);
wcscat(tmp,L"\\*");<<setw(7)<<un()<<setw(10)<<gfs(tmp)<<setw(26)<<FindFileData.cFileName<<endl;(LightGreen,Black);;
}
}(out==true)
{(pkey==true) {o<<FindFileData.cFileName<<"/
";}{ o<<FindFileData.cFileName<<" ";}(mone==true)
{<<endl;
}(LightGreen,Black);
}
{(pkey==true)
{wcout<<FindFileData.cFileName<<"/ ";}{
wcout<<FindFileData.cFileName<<" ";}(mone==true)
{<<endl;
}(LightGreen,Black);
}
}
}(FindNextFile(hf,&FindFileData)!=0);(hf);(!out==true)
cout<<endl;.str().clear(); vs.clear(); continue;
}
{=true;(vs.size()==1) {cout<<"mv: пропущен операнд, задающий файл"<<endl;continue;
}(vs.size()==2){cout<<"mv: после '"<<vs[1]<<"' пропущен операнд, задающий целевой
файл"<<endl;continue;
}.erase(vs.begin());fr,to,ik1,ik2;n;ikey=false;(int i=0; i<vs.size(); i++)
{(vs[i]=="-i") {ikey=true; vs.erase(vs.begin() +
i);}
}= vs[0]; to = vs[1];(vs.size()>2)
{(int i=2; i<vs.size();i++)
{<<"mv: неизвестный операнд или ключ
'"<<vs[i]<<"' "<<endl;
};
}katalg;_t nalfile[100]={0};(nalfile, fr.c_str(),
100);(!DirExists(nalfile)){ cout<<"mv: файл "<<fr<<" не найден"<<endl;
continue;}kat=false;_t p2[100]={0};(int i=0; i<to.length(); i++)
{(to [i] == '\\' )
{=i; kat=true;
}
}(kat==true)
{katalg=to.substr(0,n);}(p2, katalg.c_str(),
100);(!DirExists(p2)){cout<<"mv: '"<<to<<"' нет такого каталога"<<endl; continue;}(ikey
== true)
{fnd=false; bool slash=false;(int i=0; i<fr.length(); i++)
{(fr [i] == '\\' )
{=i;=true;
}
}(fnd==true) { ik1=fr.substr(n,fr.length()-n); }{
ik1=fr;}(to[to.length()-1] == '\\' ) { slash=true;}{slash=false;}(slash==true)
{ik2=to+ik1;}{ ik2=to; }_t wi1[100]={0}; wchar_t wi2[100]={0};(wi1,
ik2.c_str(), 100); mbstowcs(wi2, to.c_str(), 100);(!DirExists(wi2))
{
}(DirExists(wi1))
{<<endl<<"Вы точно хотите заменить
файл?"<<endl;
string f;(cin,f);(f=="n")
{ continue; }(f=="y")
{ }
{ cout<<"bash: ответ неверен!"<<endl; continue; }
}
}_t wmv[100]={0}; wchar_t wmv2[100]={0};(wmv, fr.c_str(),
100); mbstowcs(wmv2, to.c_str(), 100);(wmv, wmv2);
}(vs[0]=="cmp" )
{=true;(vs.size()==1){ cout<<"cmp: пропущен первый
операнд, задающий файл начальный файл"<<endl; continue;}(vs.size()==2)
{ cout<<"cmp: после '"<<vs[1]<<"' пропущен второй
операнд, задающий второй
файл"<<endl;
continue;}lkey=false; bool dif=false;.erase(vs.begin());(unsigned int i=0;
i<vs.size(); i++)
{if(vs[i]=="-l") {lkey=true; vs.erase(vs.begin() +
i);}}counter = 0; int counter2 = 1;f1(vs[0]);(!f1) { cerr<<"cmp:
"<<vs[0]<<": Нет такого файла или каталога"<<endl;
continue;}f2(vs[1]);(!f2) { cerr<<"cmp:
"<<vs[1]<<": Нет такого файла или каталога"<<endl;
continue;}ch1,ch2;err=false; bool out=false;file;(int i=0; i<vs.size(); i++)
{(vs[i]==">")
{.erase(vs.begin() + i);(i>=vs.size())
{cout<<"bash:syntax error near unexpected token
'newline'"<<endl; err =true; continue;}{ out=true; file =
vs[i].c_str(); vs.erase(vs.begin() + i);}
}
}(err==true);(vs.size()>2)
{(int i=2; i<vs.size();i++)
{<<"cmp: неизвестный операнд или ключ
'"<<vs[i]<<"' "<<endl;
};
}(!IfFileExistsAndIsNotEmpty(vs[0]) &&
!IfFileExistsAndIsNotEmpty(vs[1]) )
{ cout<<"Files are identical."<<endl;
continue; }(!IfFileExistsAndIsNotEmpty(vs[0]))
{ cout<<"cmp: конец файла в
"<<vs[0]<<endl; continue; }(!IfFileExistsAndIsNotEmpty(vs[1]))
{ cout<<"cmp: конец файла в
"<<vs[1]<<endl; continue; }(out==true)
out_file.startout(file);(lkey==true)
{
while (f1.get(ch1) && f2.get(ch2) )
{++;(ch1 != ch2)
{=true;<<counter<<setw(5)<<(int)(ch1)<<setw(5)<<(int)(ch2)<<endl;
}
}
}(f1.get(ch1) && f2.get(ch2) )
{(ch1 == '\n') counter2++;++;(ch1 != ch2)
{=true; cout<<"differ: byte
"<<counter<<", line "<<counter2<<endl;
break;
}
}(dif==false) { cout<<"Files are
identical."<<endl; }(out==true) out_file.endout();;
}(vs[0]=="wc" )
{(vs.size()<2)
{<<"wc: не хватает операнда"<<endl;
continue;
}=true;.erase(vs.begin());lkey=false; bool wkey=false; bool
ckey=false;w = 0; int l = 1; int c = 0;(int i=0; i<vs.size(); i++)
{(vs[i]=="-l") {lkey=true; vs.erase(vs.begin() +
i);}
}(int i=0; i<vs.size(); i++)
{(vs[i]=="-w") {wkey=true; vs.erase(vs.begin() +
i);}
}(int i=0; i<vs.size(); i++)
{(vs[i]=="-c") {ckey=true; vs.erase(vs.begin() +
i);}
}err=false; bool out=false;file;(int i=0; i<vs.size();
i++)
{(vs[i]==">")
{.erase(vs.begin() + i);(i>=vs.size())
{ cout<<"bash:syntax error near unexpected token
'newline'"<<endl; err =true; continue;}
{ out=true; file = vs[i].c_str(); vs.erase(vs.begin() + i);}
}
}(int i=0; i<vs.size(); i++)
{f1(vs[i]); if (!f1) { cerr<<"wc:
"<<vs[i]<<": Нет такого файла или каталога"<<endl;
err=true; continue;}
}(err==true) continue;(int i = 0; i<vs.size(); i++)
{++;(ch1 == '\n')
{++;
}
}=w+word.size();(i!=0)++;
}(l==1 && c==0) l=0;(out==true) out_file.startout(file);((lkey==false
&& wkey==false && ckey ==false) || (lkey==true &&
wkey==true && ckey ==true))
{cout<<setw(4)<<l<<setw(4)<<w<<setw(4)<<c<<setw(10)<<vs[0]<<endl;
if(out==true) {out_file.endout();}
continue;}(lkey==true)<<setw(4)<<l;(wkey==true)<<setw(4)<<w;(ckey==true)<<setw(4)<<c;<<setw(10)<<vs[0]<<endl;(out==true)
out_file.endout();;
}(vs[0]=="comm" )
{=true;.erase(vs.begin());emp1 = false; bool emp2 =false;
bool one=false; bool two=false; bool three=false; bool ontw=false; bool
onth=false; bool twth=false; bool pre=false; bool out=false;(int i=0;
i<vs.size(); i++) { if(vs[i]=="-1") {one=true; vs.erase(vs.begin()
+ i);} }(int i=0; i<vs.size(); i++) { if(vs[i]=="-2") {two=true;
vs.erase(vs.begin() + i);}}(int i=0; i<vs.size(); i++){ if(vs[i]=="-3")
{three=true; vs.erase(vs.begin() + i);}}(int i=0; i<vs.size(); i++){
if(vs[i]=="-12") {ontw=true; vs.erase(vs.begin() + i);}}(int i=0;
i<vs.size(); i++){ if(vs[i]=="-13") {onth=true;
vs.erase(vs.begin() + i);}}(int i=0; i<vs.size(); i++){ if(vs[i]=="-23")
{twth=true; vs.erase(vs.begin() + i);}}(vs.size()==1) {cout<<"comm: пропущен операнд
после
'"<<vs[0]<<"'"<<endl; continue;}<string>
c1; vector <string> c2;f1(vs[0]); if (!f1) { cerr<<"comm:
"<<vs[0]<<": Нет такого файла или каталога"<<endl;
continue;}f2(vs[1]); if (!f2) { cerr<<"comm:
"<<vs[1]<<": Нет такого файла или каталога"<<endl;
continue;}.erase(vs.begin()); vs.erase(vs.begin());err=false;file;(int i=0;
i<vs.size(); i++)
{(vs[i]==">")
{.erase(vs.begin() + i);(i>=vs.size())
{ cout<<"bash:syntax error near unexpected token
'newline'"<<endl; err =true; continue;}
{ out=true; file = vs[i].c_str(); vs.erase(vs.begin() + i);}
}
}(err==true);(vs.size()>0)
{(int i=0; i<vs.size();i++)
{<<"comm: неизвестный операнд или ключ
'"<<vs[i]<<"' "<<endl;
};
}tmp;(getline(f1, tmp)) c1.push_back(tmp);(c1.size()==0) {
emp1=true;}(getline(f2, tmp)) c2.push_back(tmp);(out==true)
out_file.startout(file);(c2.size()==0)
{=true;(emp1==true) { continue; }
{(int i=0;i<c1.size();i++)
{<<setw(12)<<c1[i]<<endl;
};
}
}(emp1==true && emp2==false)
{ for(int i=0;i<c2.size();i++) {
cout<<setw(12)<<c2[i]<<endl;} continue }(three==false
&& onth==false && twth==false)
{(int i=0; i<c1.size(); i++)
{(int p=0; p<c2.size(); p++)
{ if(c1[i]==c2[p])
cout<<setw(18)<<c1[i]<<endl; }
}
}(ontw==false && two==false && twth==false )
{ for(int i=0; i<c2.size(); i++)
{ for(int p=0; p<c1.size(); p++)
{ if(c2[i]==c1[p]) { pre=true; } }(pre==true) { pre=false;
continue;} else {
cout<<setw(12)<<c2[i]<<endl;}=false;}}(one==false &&
ontw==false && onth==false)
{(int i=0; i<c2.size(); i++)
{(int p=0; p<c1.size(); p++)
{ if(c1[i]==c2[p]) { pre=true; } }(pre==true) { pre=false;
continue;}
{ cout<<setw(6)<<c1[i]<<endl;}=false;
}
}(out==true) out_file.endout();
}
{(was==true) {was=false; continue;}{cout<<"bash:
"<<vs[0]<<": команда
не найдена"<<endl; continue;}
}
}0;
}