Якщо досягнутий кінець файлу, то функція 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("\n\nGladkyj A.V. - 4ok2\nVar. 14\nCom: Ar, Split, Edit, Join\n\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\n");
}
if(argv[1][0]=='e'){
res=spawnl(P_WAIT,"rar.exe","","e",argv[2],NULL);
if(res!=-1) printf("Done archive unpacking\n");
}
if(res==-1){
printf("Error executing application\n");
}
}
void arhelp(void){
printf("Usage:\n"
"\tar a arc file - Create an archive\n"
"\tar e arc - Unpack archive\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\nType \"split /?\" for help\n");
return;
}
fi=fopen(args[1],"rb");
if(!fi){
printf("Fatal error: cannot open source file\n");
return;
}
fseek(fi,0,SEEK_END);
fpos_t fsize=ftell(fi);
if(fsize==0){
printf("Cannot split empty file\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\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\n");
fclose(fi);
fclose(fo);
return;
}
sz1-=i;
if(fwrite(buf,1,i,fo)!=i){
printf("Error writing destantion file\n");
fclose(fi);
fclose(fo);
return;
}
}
fflush(fo);
fclose(fo);
fo=fopen(args[3],"wb");
if(!fo){
printf("Fatal error: cannot open destantion file\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\n");
fclose(fi);
fclose(fo);
return;
}
sz2-=i;
if(fwrite(buf,1,i,fo)!=i){
printf("Error writing destantion file\n");
fclose(fi);
fclose(fo);
}
}
fflush(fo);
fclose(fo);
printf("File %s is splited to files %s and %s.\n", args[1],args[2],args[3]);
}
void splithelp(void){
printf("Usage: split source dest1 dest2\n"
"\tsource Name of source file\n"
"\tdest1, dest2 Names of files to split in\n");
}
void editexec(unsigned argc,char **argv){
if(argc!=2){
printf("Invalid artgument count\n");
return;
}
if(_creat(argv[1],FA_NORMAL)==-1){
printf("Error creating file\n");
}
}
void edithelp(void){
printf("Usage: edit <filename>\nCreate file\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\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
ДОДАТОК В
Алгоритм головної програми