Реферат по предмету "Информатика, программирование"


Програми копіювання файлів

Міністерствоосвіти і науки України
Житомирський державний технологічнийуніверситет
Лабораторнаробота №1
з курсу«Системне програмування»
на тему: «Програмикопіювання файлів»
м. />Житомир2011 р.

Зміст
1. Навчитисякористуватись програмами copy1.exe та copy2.exe.
2. Розібрати роботупрограм
2.1 Робота програми«COPY1.EXE»
2.2 Робота програми«COPY1.EXE»
3. Експерименти з«copy1.c»
4. Експерименти з«copy2.c»
Контрольні запитання
Висновок
Список використаної літератури
1. Навчитися користуватись програмами copy1.exe та copy2.exe
Програми«COPY1.С» та «COPY2.С» призначені для копіювання файлів. Програма «COPY1.С» використовуєфункції роботи з file handles, а «COPY2.С» — функції потокового вводу-виводу.
Длякористування програмами:
· їх необхідно скомпілювати та отримативиконавчі файли «COPY1.EXE» та «COPY2.EXE»;
· запустити необхідну програму задопомогою командного рядка, ввівши відповідно "ім’я_прогрми"«файл_з_якого_копіювати» «файл_в_який_копіювати»;
програмакопіювання файл

2.Розібрати роботу програм
 
2.1Робота програми «COPY1.EXE»
Підключаємозаголовочні файли для використання функцій та змінних:
#include //open(), eof(), read(), write(), close()
#include //getch()
#include //printf()
#include //exit()
#include //O_BINARY, O_RDONLY, O_WRONLY, O_CREAT, O_EXCL, O_TRUNC
#include //
#include //S_IREAD, S_IWRITE
#include //
#include //EEXIST
Макрос,що визначає розміру масиву
#defineBUFSIZE 10000
Функціяmain() має два аргументи: цілочисельний аргумент argc який містить кількістьаргументів у командному рядку та покажчик на масив покажчиків на рядки, декожен вказує на певний аргумент командного рядка.
voidmain( int argc, char **argv ) {
Оголошуємозмінні:
intsource, target;
inti;
char*buffer;
intcount;
Перевіряємочи правильна кількість аргументів у командному рядку. Якщо аргументів не три(програма, файл для копіювання, файл-копія), виводиться повідомлення проправильність заповнення командного рядка і виконання програми завершується.
if(argc != 3 ){
printf("\n"
«Usage:COPY1 [d:][\\path]source_file [d:][\\path]target_file\n» );
getch();
exit(1 );
}
Відкриваємофайл, який будемо копіювати за допомогою функції open(). Для цього передаємо вякості параметрів покажчик на імя файлу (argv[ 1 ]) та вказуємо типи доступу дофайлу. O_BINARY — прапор доступу у бінарному режимі. O_RDONLY — прапор доступудо файлу «лише для читання». Функція open() у випадку успішноговиконання повертає file handle і встановлює курсор на початок файлу, а увипадку помилки повертає -1 та встановлює errno в один із наступних станів:ENOENT, EMFILE, EACCES, EINVACC.
Данимif-ом перевіряємо успішність відкриття файлу, який варто копіювати.
if(( source = open( argv[ 1 ], O_BINARY | O_RDONLY ) ) == -1 ) {
printf("\nOpen source file error: %d", errno );
getch();
exit(2 );
}
Відкриваємофайл, в який будемо копіювати за допомогою тієї ж функції open().
Прапордоступу до файлу встановлюємо в один із положень:
· O_BINARY — бінарний;
· O_WRONLY — для запису;
· O_CREAT — створюється;
· O_EXCL — перезаписується.
Прапор способувідкриття встановлюємо в один із положень:
· S_IREAD — може бути прочитаний;
· S_IWRITE — може бути записаний.
target= open( argv[ 2 ], O_BINARY | O_WRONLY | O_CREAT | O_EXCL,
S_IREAD| S_IWRITE );
Якщопри відкритті(створенні) файлу до якого буде відбуватися копіювання, errnoдорівнює EEXIST (тобто файл з таким ім’ям вже існує), повідомити про існуванняфайлу та запитати про необхідність його перезапису.
if(errno == EEXIST ) {
printf("\nFile already exists. Overwrite? (Y/N)\n" );
i= getch();
if(( i == 'y' ) || ( i == 'Y' ) )
target= open( argv[ 2 ], O_BINARY | O_WRONLY | O_CREAT | O_TRUNC,
S_IREAD| S_IWRITE );
}
Перевіритичи вдалося створити файл .
if(target == -1 ) {
printf("\nOpen target file error: %d", errno );
getch();
exit(2 );
}
Цілочисельнійзмінній count присвоїти значення макросу BUFSIZE.
count= BUFSIZE;
Виділитипам’ять на масив buffer розміром count, та перевірити чи пам’ять дійсновиділена.
if(( buffer = ( char* )malloc( count ) ) == NULL ) {
printf("\nNot enough memory" );
getch();
exit(3 );
}
Задопомогою оператора while, який буде виконуватися доти, доки функція eof() незнайде закінчення файлу, який копіюється, будемо виконувати читання та запис звихідного файлу у вхідний.
while(!eof( source ) ) {
Задопомогою функції read() зчитаємо із файлу source до масиву buffer countбайтів.
if(( count = read( source, buffer, count ) ) == -1 ) {
printf("\nRead file error: %d", errno );
getch();
exit(4 );
}
Задопомогою функції write() запишемо до файлу target із масиву buffer countбайтів.
if(( count = write( target, buffer, count ) ) == -1 ) {
printf("\nWrite file error: %d", errno );
getch();
exit(5 );
}
}
Закриємовідкриті файли та звільнимо пам’ять із буферу.
close(source );
close(target );
free(buffer );
Проінформуємопро успішне копіювання.
printf(«Filecopy...»);
getch();
}
 

2.2Робота програми «COPY1.EXE»
Підключаємозаголовочні файли для використання функцій та змінних:
#include
#include
#include
Оголошуємопрототип функції
voidfilecpy( FILE *stream_from, FILE *stream_to );
Оголошуємодва символьних масиви розміром BUFSIZ*10;
charbuf1[ BUFSIZ * 10 ];
charbuf2[ BUFSIZ * 10 ];
Функціяmain() має два аргументи: цілочисельний аргумент argc який містить кількістьаргументів у командному рядку та покажчик на масив покажчиків на рядки, де коженвказує на певний аргумент командного рядка.
voidmain( int argc, char *argv[] ) {
Оголосимозмінні:
time_tstart, end;
FILE*stream_from, *stream_to;
Перевіряємочи правильна кількість аргументів у командному рядку. Якщо аргументів не три(програма, файл для копіювання, файл-копія), виводиться повідомлення проправильність заповнення командного рядка і виконання програми завершується.
if(argc
printf("\nUsage:"
"COPY2 [d:][\\path]source_file [d:][\\path]target_file\n" );
exit(1 );
}
Відкриваємофайл, який варто копіювати, для читання.
if(( stream_from = fopen( argv[ 1 ], «rt» ) ) == NULL ) {
printf("\nOpen source file error: %d", errno );
exit(1 );
}
Відкриваємофайл, в який варто копіювати, для запису(якщо файлу не існує, він створюється,якщо існує — перезаписується).
stream_to= fopen( argv[ 2 ], «wt+» );
Вмикаємотактовий лічильник, і його стартове значення присвоюємо змінній start.
start= clock();
Викликаємофункцію для копіювання і передаємо їй покажчик на файл який варто копіювати іна файл до якого необхідно копіювати.
filecpy(stream_from, stream_to );
Вимикаємотактовий лічильник, і його фінальне значення присвоюємо змінній end.
end= clock();
Друкуємоінформацію про затрачений час на виконання функції і про розмір буферу якийдовелося використати.
printf(«Copying time is %5.1f. Buffer size is %d bytes\n»,
(( float )end — start ) / CLK_TCK, BUFSIZ );
Відкриваємофайл, який варто копіювати, та файл до якого варто копіювати.
if(( stream_from = fopen( argv[ 1 ], «rt») ) == NULL )
exit(1 );
stream_to= fopen( argv[ 2 ], «wt+» );
Задаємобуфери за допомогою функції setvbuf(), які будуть використовуватися у якостібуферів потоків для операцій вводу/виводу. Причому для буферизації будемовикористовувати повний об’єм буфера, оскільки використовується режим _IOFBF.
setvbuf(stream_from, buf1, _IOFBF, sizeof( buf1 ) );
setvbuf(stream_to, buf2, _IOFBF, sizeof( buf2 ) );
Викликаємофункцію для копіювання, при цьому підраховуємо затрачений на її виклик час тавикористану пам'ять.
start= clock();
filecpy(stream_from, stream_to );
end= clock();
printf(«Copying time is %5.1f. Buffer size is %d bytes\n»,
(( float )end — start ) / CLK_TCK, BUFSIZ * 10 );
Відкриваємофайл, який варто копіювати, та файл до якого варто копіювати.
if(( stream_from = fopen( argv[ 1 ], «rt») ) == NULL )
exit(1 );
stream_to= fopen( argv[ 2 ], «wt+» );
Задаємобуфери. Але потіки не буферизується, оскільки використовується режим _IONBF.
setvbuf(stream_from, NULL, _IONBF, 0 );
setvbuf(stream_to, NULL, _IONBF, 0 );
Викликаємофункцію для копіювання, при цьому підраховуємо затрачений на її виклик час тавикористану пам'ять.
start= clock();
filecpy(stream_from, stream_to );
end= clock();
printf(«Copying time is %5.1f. Buffers is not used\n»,
(( float )end — start ) / CLK_TCK );
exit(0 );
}
Функціякопіювання файлів з використанням потоку вводу/виводу.
Аргументи:FILE *stream_from — покажчик на потік звідки копіювати;
FILE*stream_to — покажчик на потік в який копіювати;
Функціянічого не повертає і не використовує глобальних змінних.
voidfilecpy( FILE *stream_from, FILE *stream_to ) {
Оголошуємосимвольний масив на 256 знаків
charlinebuf[ 256 ];
Задопомогою оператора while та функції feof() шукаємо кінець потоку з якогокопіюємо.
while(!feof( stream_from ) ) {
Використовуючифункцію fgets(), до масиву linebuf заносимо значенням із вихідного потокуstream_from.
if(fgets( linebuf, 255, stream_from ) == NULL ) break;
Використовуючифункцію fputs(), із масив linebuf виштовхуємо значенням до вхідного потокуstream_to.
if(fputs( linebuf, stream_to ) == EOF ) break;
}
Закриваємофайли.
fclose(stream_from );
fclose(stream_to );
}

3.Експерименти з «copy1.c»
 
Впрограмі copy1.c замінити бінарний режим доступу до обох файлів на текстовий ізапустити програму для копіювання досить великого бінарного файлу. Результатиексперименту зафіксувати в зошиті. Пояснити причину ефекту
Призміні з бінарного режиму доступу до обох файлів на текстовий відбувається неповне копіювання (створений файл менший), а лише до символу Ctrl-Z(ASCII 1Ah), адже вважається, що досягнуто кінець файлу (умова EOF).
Впрограмі copy1.c замінити бінарний режим доступу до файлу, який записується, натекстовий і запустити програму. Результати експерименту зафіксувати в зошиті.Пояснити причину ефекту.
Призміні з бінарного режиму доступу до файлу, який записується, на текстовийстворюється не достовірна копія (створений файл більший), оскільки відбуваєтьсявідображення кожного символу який був зчитаний у бінарному режимі. Таким чином пара,наприклад, символів CR LF не перетворюється в один символ нового рядка “\n”, авиводиться окремо як два символи.

4.Експерименти з «copy2.c»
Впрограмі copy2.c знайти оптимальний розмір буферу. Обґрунтувати вибір.
Намою думку, оптимальним розміром буферу буде розмір кратний числу 512. Це можнапоясноит тим, що функція дає виграш в продуктивності при перенесенні відразуцілої групи байтів (блоку) за одне звернення до функції. Максимальний виграш досягаєтьсятоді, коли розмір блоку який переноситься з програми в файл кратний розмірусектора диску, а саме 512 байт.
Впрограмі copy2.c модифікувати програму так, щоб вона виводила на екран вмістфайлу за допомогою функцій puts(), fputs(), printf(), fwrite(). Результатиексперименту зафіксувати в зошиті. Пояснити причину ефекту.
Привикористанні функцій виведення на екран, відбувається виведення не екранінформації з вихідного файлу у тому вигляді, який передбачений відповідноюфункцією. При цьому затрачається більше часу на виконання програми.

Контрольнізапитання
1. Чим відрізняється текстовий режимдоступу до файлу від бінарного?
Як для потоковихтак і для префіксних функцій файлового введення-виведення можливі два різнихрежими доступу до файлу: текстовий та бінарний. В текстовому режимі виконуєтьсятрансляція символів CR LF (0Dh 0Ah). При читанні інформації з файлу в цьомурежимі пара символів CR LF перетворюється в один символ нового рядка “\n” а призаписі ‑ символ нового рядка перетворюється в пару символів CR LF. Крімтого, як тільки з файлу зчитується символ Ctrl-Z (ASCII 1Ah), вважається,що досягнуто кінець файлу (умова EOF). Таким чином, в текстовому режимі невдається прочитати інформацію, розташовану після символу Ctrl-Z. При виконанніфайлового введення-виведення в бінарному режимі жодного перетворення символівне відбувається, а всі вони розглядаються як такі що не мають якогосьособливого сенсу. Режим доступу до файлу задається під час відкриття файлучерез бібліотечну функцію відкриття або спеціальною зовнішньою змінною _fmode.
2. Що таке дескриптор(handle) файлу?
Відкриттяфайлів виконує функція АН = 3Dh MS-DOS. Пара регістрів DS:DX вказує наASCIIZ-рядок, що містить специфікацію файлу, що відкривається як регулярний,або ім’я драйверу символьного пристрою. В регістрі AL задається режим відкриттяфайлу. Значення яке повертається функцією в регістр АХ є ціле число, це префікс(handle) або дескриптор файлу. При всіх наступних операціях доступу до відкритогофайлу в MS-DOS для ідентифікації файлу повідомляється тільки префікс.
2. Чим відрізняється префіксний доступ дофайлу від потокового?
Бібліотечніфункції Turbo C для роботи з файлами можна поділити на дві групи: потоковіта префіксні. Як потокові, так і префіксні функції звертаються, в принципі, дотих самих викликам функцій MS-DOS. Однак, потокові функції виконують додатковубуферизацію інформації. Це призводить до подвійної буферизації інформації: нарівні бібліотечної функції і на рівні MS-DOS. Префіксні функції не виконуютьдодаткову буферизацію, а відразу звертаються до префіксних функцій MS-DOS.
3. В яких випадках більше доцільнийпотоковий доступ? Чому?
Префіксніфункції дають виграш в продуктивності при перенесенні відразу цілої групибайтів (блоку) за одне звернення до функції. Максимальний виграш досягаєтьсятоді, коли розмір блоку який переноситься з програми в файл кратний розмірусектора диску (512 байт). Перенесення інформації між файлом і Сі-програмоюпо символам або по рядкам виявляється більш ефективним при використанні функційпотокового файлового введення-виведення. 
Висновок
Отже, привиконанні даної лабораторної роботи було використано дві програми копіюванняфайлів «COPY1.С» та «COPY2.С». Програма «COPY1.С» використовує функції роботи зfile handles, а «COPY2.С» — функції потокового вводу-виводу. Було проведеноповний розбір роботи обох кодів програм, їх тестування, модифікацію таоптимізацію.
Загалом у ходівиконання лабораторної роботи були отримані всі необхідні знання та практичнінавички для роботи з файлами.

Списоквикористаної літератури
1. Касаткін А.І. Управление ресурсами. — Минск: Вышейшая школа, 1992.
2. Касаткін А.І. Системное программирование.- Минск: Вышейшая школа, 1991.
3. Власенко О.В., Данильченко О.М., Северин О.О. Системнепрогрмамування. Курс лекцій. Частина 1. (бібліотека ЖІТІ)


Не сдавайте скачаную работу преподавателю!
Данный реферат Вы можете использовать для подготовки курсовых проектов.

Поделись с друзьями, за репост + 100 мильонов к студенческой карме :

Пишем реферат самостоятельно:
! Как писать рефераты
Практические рекомендации по написанию студенческих рефератов.
! План реферата Краткий список разделов, отражающий структура и порядок работы над будующим рефератом.
! Введение реферата Вводная часть работы, в которой отражается цель и обозначается список задач.
! Заключение реферата В заключении подводятся итоги, описывается была ли достигнута поставленная цель, каковы результаты.
! Оформление рефератов Методические рекомендации по грамотному оформлению работы по ГОСТ.

Читайте также:
Виды рефератов Какими бывают рефераты по своему назначению и структуре.