Смекни!
smekni.com

Програма емуляції роботи командного процесора операційної системи (стр. 3 из 3)

Якщо досягнутий кінець файлу, то функція getc () повертає EOF.

Функція fseek

Повторно поміщає вказівник файлу потоку. Тобто встановлює

вказівник файлу, зв’язаний з потоком в нове положення. Fseek використовується з введенням-виведенням потоку. Якщо вказівник переміщений успішно fseek повертає 0, а при помилці fseek повертає якесь інше відмінне від 0. fseek повертає значення помилки лише в тих випадках коли не відкривається файл. Замість FILE *stream вказується ім’я файлу, long offset – , int whence – зазначається місце куди потрібно відправити вказівник.

fseek(FILE *stream, long offset, int whence);

Функція ftell.

Повертає поточний вказівник файлу. Точніше кажучи повертає вказівник файлу для потоку. Функція ftell, яка повертає вказівник може використовуватись в наступному запиті до функції fseek. При успішній роботі функція повертає поточне положення вказівника файлу. При помилці повертає –1. FILE *stream – вказується назва файлу, тобто файл якому потрібно повернути вказівник.

ftell(FILE *stream);


ВИСНОВКИ

В результаті виконання курсового проекту було створено програму-емулятор командного процесора, яка в свою чергу виконує наступні команди: створення текстових файлів, з'єднання текстових файлів в один (зміст з'єднуваних файлів подається одним суцільним текстом в результуючому файлі), архівація файлів та розріз файлів на частини. В процесі виконання даної роботи було досліджено принципи функціонування командного процесора та розроблено програму на мовах програмування C++ та Асемблера. При написанні програми було використано принципи функціонування командного процесора.

Програма має головну довідку, яка містить перелік виконуваних команд, довідки по кожній команді з правильним синтаксисом, що значно спростить використання її користувачем

У курсовому проекті було використано функції мови програмування С++ та мови низького рівня програмування – Асемблера. Використання різних методів та ресурсів програмування дозволило створити невелику за об’ємом та швидкодіючу програму емуляції роботи командного процесора ОС.


ЛІТЕРАТУРА

1. Баженова І. Ю. Visual C++ 6.0 Уроки програмування. – Київ: Фоліо, 1997

2. Б. Керниган, Д. Ричи. Язык программирования «С». – Москва: Видавництво 1996

3. Белецкий Я. И. Turbo C++. М. : Видавництво Машиностроение 1994.

4. Прокофьев Б. П. Turbo C и Turbo C++. - Москва: СП «Ланит», 1992

5. Бъерн Страуструп. Язык программирования «С». – Москва: Видавництво 1998

6. Джес Либерти. Освой самостоятельно С++ за 21 день. – Москва:

Вільямс, 2001

7. Тед Фейсон Borland C. Обьектно ориентированое прорамирование. – Москва: SAMS, 1996

8. Зубков С. В. Assembler для DOS, Windows и Unix ., Москва: ДМК, 2005

9. С. Бочков. Д. Субботин. Язык программирования Си для персонального компьютера. М: Радио и связь, 1990

10. Стенли Б. Язык программирования С++. - Москва: SAMS, 2000

11. Страуструп Б.В. Язык программирования С++. - М. : Радио и связь, 1991.

ДОДАТОК А

Лістинг головної програми та команд мовою С++

#pragma option -ms

#include<stdio.h>

#include<string.h>

#include<process.h>

#include<dos.h>

#include<io.h>

#define maxarg 10

extern "C" void joinhelp(void);

extern "C" void joinexec(unsigned,char **);

typedef void(* exec)(unsigned ,char **);

typedef void(* help)(void);

struct CLIST{

char* cmdname;

exec execu;

help hlp;

};

unsigned argc;

char* args[maxarg];

unsigned cmdnum,cmd;

void Help(unsigned, char**){

printf("&bsol;n&bsol;nGladkyj A.V. - 4ok2&bsol;nVar. 14&bsol;nCom: Ar, Split, Edit, Join&bsol;n&bsol;n");

}

void arexec(unsigned ,char **argv){

int res;

if(argv[1][0]=='a'){

res=spawnl(P_WAIT,"rar.exe","","a",argv[2],argv[3],NULL);

if(res!=-1) printf("Done archive creation&bsol;n");

}

if(argv[1][0]=='e'){

res=spawnl(P_WAIT,"rar.exe","","e",argv[2],NULL);

if(res!=-1) printf("Done archive unpacking&bsol;n");

}

if(res==-1){

printf("Error executing application&bsol;n");

}

}

void arhelp(void){

printf("Usage:&bsol;n"

"&bsol;tar a arc file - Create an archive&bsol;n"

"&bsol;tar e arc - Unpack archive&bsol;n");

}

#define min(a,b) ((a)<(b))?(a):(b)

#define bufsz 512

void splitexec(unsigned argc,char** args){

FILE *fi,*fo;

char buf[bufsz];

if(argc!=4){

printf("Illegal parameter count&bsol;nType &bsol;"split /?&bsol;" for help&bsol;n");

return;

}

fi=fopen(args[1],"rb");

if(!fi){

printf("Fatal error: cannot open source file&bsol;n");

return;

}

fseek(fi,0,SEEK_END);

fpos_t fsize=ftell(fi);

if(fsize==0){

printf("Cannot split empty file&bsol;n");

fclose(fi);

return;

}

fpos_t sz1=fsize/2, sz2=fsize-sz1;

fseek(fi,0,SEEK_SET);

fo=fopen(args[2],"wb");

if(!fo){

printf("Fatal error: cannot open destantion file&bsol;n");

fclose(fi);

return;

}

while(sz1){

fpos_t i;

fpos_t toread;

toread=min(bufsz,sz1);

i=fread(buf,1,toread,fi);

if((i==0)&&(sz1!=0)){

printf("Error reading source file&bsol;n");

fclose(fi);

fclose(fo);

return;

}

sz1-=i;

if(fwrite(buf,1,i,fo)!=i){

printf("Error writing destantion file&bsol;n");

fclose(fi);

fclose(fo);

return;

}

}

fflush(fo);

fclose(fo);

fo=fopen(args[3],"wb");

if(!fo){

printf("Fatal error: cannot open destantion file&bsol;n");

fclose(fi);

return;

}

while(sz2){

fpos_t i;

fpos_t toread;

toread=min(bufsz,sz2);

i=fread(buf,1,toread,fi);

if((i==0)&&(sz2!=0)){

printf("Error reading source file&bsol;n");

fclose(fi);

fclose(fo);

return;

}

sz2-=i;

if(fwrite(buf,1,i,fo)!=i){

printf("Error writing destantion file&bsol;n");

fclose(fi);

fclose(fo);

}

}

fflush(fo);

fclose(fo);

printf("File %s is splited to files %s and %s.&bsol;n", args[1],args[2],args[3]);

}

void splithelp(void){

printf("Usage: split source dest1 dest2&bsol;n"

"&bsol;tsource Name of source file&bsol;n"

"&bsol;tdest1, dest2 Names of files to split in&bsol;n");

}

void editexec(unsigned argc,char **argv){

if(argc!=2){

printf("Invalid artgument count&bsol;n");

return;

}

if(_creat(argv[1],FA_NORMAL)==-1){

printf("Error creating file&bsol;n");

}

}

void edithelp(void){

printf("Usage: edit <filename>&bsol;nCreate file&bsol;n");

}

CLIST clist[]={{"",NULL,NULL}, {"exit",NULL,NULL}, {"help",Help,NULL},

{"split",splitexec,splithelp}, {"ar",arexec,arhelp},

{"edit",editexec,edithelp}, {"join",joinexec,joinhelp}};

void main(void){

char cmdline[100];

cmdnum=6;

while(1){

printf("***KOM*** > ");

gets(cmdline);

if(!strlen(cmdline)) continue;

args[0]=strtok(cmdline," ");

argc=1;

while(args[argc]=strtok(NULL," ")) argc++;

cmd=0;

for(int i=1;i<=cmdnum;i++)

if(!strcmpi(args[0],clist[i].cmdname)){

cmd=i;

break;

}

if(cmd==0){

printf("Unknown command&bsol;n");

continue;

}

if(cmd==1) return;

if(cmd==2){

clist[2].execu(0,NULL);

continue;

}

if(!strcmp(args[1],"/?")){

clist[cmd].hlp();

continue;

}

clist[cmd].execu(argc,args);

}

}


ДОДАТОК Б

Лістинг команди мовою Assembler

model small

public C joinhelp,C joinexec

.code

help db "Usage: join <file_1> <file_2> <dest_file_3>",10,13,"Join given 2 files to one",10,13,"$"

errormsg db "Error.",10,13,"$"

joinexec proc

arg argc:word,argv:word ;char**

push bp

mov bp,sp

mov si,argv;Load address of pointers array

mov dx,[si+2];Load address of second argument(argv[1])

mov ah,3ah

int 21h ;rmdir

jnc fin

push ds

push cs

pop ds

mov ah,9

mov dx,offset errormsg

int 21h

transerr:

mov ah,9

mov dx,offset transfermsg

int 21h

mov bx,file1

call fclose ;close src

mov bx,file2

call fclose ;close dst

pop ds

jmp fin

opensrc1err:

push ds

push cs

pop ds

mov ah,9

mov dx,offset erropen1

int 21h

pop ds

jmp fin

opendst2err:

push ds

push cs

pop ds

mov ah,9

mov dx,offset erropen2

int 21h

mov bx,file1

call fclose ;close src

pop ds

jmp fin

fin:pop bp

ret

pop ds

fin:pop bp

ret

joinexec endp

opensrc proc

mov ax,3d00h

mov dx,[si+2];Open src. file argv[1]

int 21h

ret

opensrc endp

fclose proc

mov ah,3eh

int 21h ;Close source

ret

fclose endp

createdst proc

mov ah,3ch

xor cx,cx

mov dx,[si+4];Open dst. file argv[2]

int 21h

ret

createdst endp

joinhelp proc

push ds

push cs

pop ds

mov ah,9

mov dx,offset help

int 21h

pop ds

ret

joinhelp endp

end

ДОДАТОК В

Алгоритм головної програми