Програми копіювання файлів - Программирование, компьютеры и кибернетика лабораторная работа

Програми копіювання файлів - Программирование, компьютеры и кибернетика лабораторная работа



































Дослідження основних завдань та алгоритму роботи програм копіювання файлів: "COPY1.С" (функції роботи з file handles) та "COPY2.С" (функції потокового вводу-виводу). Повний розбір роботи обох кодів програм, їх тестування, модифікація та оптимізація.


посмотреть текст работы


скачать работу можно здесь


полная информация о работе


весь список подобных работ


Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Міністерство освіти і науки України
Житомирський державний технологічний університет
на тему: «Програми копіювання файлів»
Програми «COPY1.С» та «COPY2.С» призначені для копіювання файлів. Програма «COPY1.С» використовує функції роботи з file handles, а «COPY2.С» - функції потокового вводу-виводу.
· їх необхідно скомпілювати та отримати виконавчі файли «COPY1.EXE» та «COPY2.EXE»;
· запустити необхідну програму за допомогою командного рядка, ввівши відповідно "ім'я_прогрми" "файл_з_якого_копіювати" "файл_в_який_копіювати";
Підключаємо заголовочні файли для використання функцій та змінних:
#include //open(), eof(), read(), write(), close()
#include //O_BINARY, O_RDONLY, O_WRONLY, O_CREAT, O_EXCL, O_TRUNC
#include //S_IREAD, S_IWRITE
Функція main() має два аргументи: цілочисельний аргумент argc який містить кількість аргументів у командному рядку та покажчик на масив покажчиків на рядки, де кожен вказує на певний аргумент командного рядка.
void main( int argc, char **argv ) {
Перевіряємо чи правильна кількість аргументів у командному рядку. Якщо аргументів не три (програма, файл для копіювання, файл-копія), виводиться повідомлення про правильність заповнення командного рядка і виконання програми завершується.
"Usage: COPY1 [d:][\\path]source_file [d:][\\path]target_file\n" );
Відкриваємо файл, який будемо копіювати за допомогою функції 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 );
Відкриваємо файл, в який будемо копіювати за допомогою тієї ж функції open().
Прапор доступу до файлу встановлюємо в один із положень:
Прапор способу відкриття встановлюємо в один із положень:
target = open( argv[ 2 ], O_BINARY | O_WRONLY | O_CREAT | O_EXCL,
Якщо при відкритті(створенні) файлу до якого буде відбуватися копіювання, errno дорівнює EEXIST (тобто файл з таким ім'ям вже існує), повідомити про існування файлу та запитати про необхідність його перезапису.
printf( "\nFile already exists. Overwrite? (Y/N)\n" );
target = open( argv[ 2 ], O_BINARY | O_WRONLY | O_CREAT | O_TRUNC,
Перевірити чи вдалося створити файл .
printf( "\nOpen target file error: %d", errno );
Цілочисельній змінній count присвоїти значення макросу BUFSIZE.
Виділити пам'ять на масив buffer розміром count, та перевірити чи пам'ять дійсно виділена.
if( ( buffer = ( char* )malloc( count ) ) == NULL ) {
За допомогою оператора while, який буде виконуватися доти, доки функція eof() не знайде закінчення файлу, який копіюється, будемо виконувати читання та запис з вихідного файлу у вхідний.
За допомогою функції read() зчитаємо із файлу source до масиву buffer count байтів.
if( ( count = read( source, buffer, count ) ) == -1 ) {
printf( "\nRead file error: %d", errno );
За допомогою функції write() запишемо до файлу target із масиву buffer count байтів.
if( ( count = write( target, buffer, count ) ) == -1 ) {
printf( "\nWrite file error: %d", errno );
Закриємо відкриті файли та звільнимо пам'ять із буферу.
Проінформуємо про успішне копіювання.
Підключаємо заголовочні файли для використання функцій та змінних:
void filecpy( FILE *stream_from, FILE *stream_to );
Оголошуємо два символьних масиви розміром BUFSIZ*10;
Функція main() має два аргументи: цілочисельний аргумент argc який містить кількість аргументів у командному рядку та покажчик на масив покажчиків на рядки, де кожен вказує на певний аргумент командного рядка.
void main( int argc, char *argv[] ) {
Перевіряємо чи правильна кількість аргументів у командному рядку. Якщо аргументів не три (програма, файл для копіювання, файл-копія), виводиться повідомлення про правильність заповнення командного рядка і виконання програми завершується.
" COPY2 [d:][\\path]source_file [d:][\\path]target_file\n" );
Відкриваємо файл, який варто копіювати, для читання.
if( ( stream_from = fopen( argv[ 1 ], "rt" ) ) == NULL ) {
printf( "\nOpen source file error: %d", errno );
Відкриваємо файл, в який варто копіювати, для запису(якщо файлу не існує, він створюється, якщо існує - перезаписується).
stream_to = fopen( argv[ 2 ], "wt+" );
Вмикаємо тактовий лічильник, і його стартове значення присвоюємо змінній start.
Викликаємо функцію для копіювання і передаємо їй покажчик на файл який варто копіювати і на файл до якого необхідно копіювати.
Вимикаємо тактовий лічильник, і його фінальне значення присвоюємо змінній end.
Друкуємо інформацію про затрачений час на виконання функції і про розмір буферу який довелося використати.
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 )
stream_to = fopen( argv[ 2 ], "wt+" );
Задаємо буфери за допомогою функції setvbuf(), які будуть використовуватися у якості буферів потоків для операцій вводу/виводу. Причому для буферизації будемо використовувати повний об'єм буфера, оскільки використовується режим _IOFBF.
setvbuf( stream_from, buf1, _IOFBF, sizeof( buf1 ) );
setvbuf( stream_to, buf2, _IOFBF, sizeof( buf2 ) );
Викликаємо функцію для копіювання, при цьому підраховуємо затрачений на її виклик час та використану пам'ять.
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 )
stream_to = fopen( argv[ 2 ], "wt+" );
Задаємо буфери. Але потіки не буферизується, оскільки використовується режим _ IONBF .
setvbuf( stream_from, NULL, _IONBF, 0 );
setvbuf( stream_to, NULL, _IONBF, 0 );
Викликаємо функцію для копіювання, при цьому підраховуємо затрачений на її виклик час та використану пам'ять.
printf( "Copying time is %5.1f. Buffers is not used\n",
( ( float )end - start ) / CLK_TCK );
Функція копіювання файлів з використанням потоку вводу/виводу.
Аргументи: FILE *stream_from - покажчик на потік звідки копіювати;
FILE *stream_to - покажчик на потік в який копіювати;
Функція нічого не повертає і не використовує глобальних змінних.
void filecpy( FILE *stream_from, FILE *stream_to ) {
Оголошуємо символьний масив на 256 знаків
За допомогою оператора while та функції feof() шукаємо кінець потоку з якого копіюємо.
Використовуючи функцію fgets(), до масиву linebuf заносимо значенням із вихідного потоку stream_from.
if( fgets( linebuf, 255, stream_from ) == NULL ) break;
Використовуючи функцію fputs(), із масив linebuf виштовхуємо значенням до вхідного потоку stream_to.
if( fputs( linebuf, stream_to ) == EOF ) break;
В програмі copy1.c замінити бінарний режим доступу до обох файлів на текстовий і запустити програму для копіювання досить великого бінарного файлу. Результати експерименту зафіксувати в зошиті. Пояснити причину ефекту
При зміні з бінарного режиму доступу до обох файлів на текстовий відбувається не повне копіювання (створений файл менший), а лише до символу Ctrl-Z (ASCII 1Ah), адже вважається, що досягнуто кінець файлу (умова EOF).
В програмі copy1.c замінити бінарний режим доступу до файлу, який записується, на текстовий і запустити програму. Результати експерименту зафіксувати в зошиті. Пояснити причину ефекту.
При зміні з бінарного режиму доступу до файлу, який записується, на текстовий створюється не достовірна копія (створений файл більший), оскільки відбувається відображення кожного символу який був зчитаний у бінарному режимі. Таким чином пара, наприклад, символів CR LF не перетворюється в один символ нового рядка “\n”, а виводиться окремо як два символи.
В програмі 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. (бібліотека ЖІТІ)
Написання програм для перейменування файлів та копіювання файлів і підкаталогів (аналоги REN, XCOPY). Вибір методу розв'язки задачі та його обґрунтування. Алгоритм та реалізація програми, її системні вимоги. Інструкція для користувача та лістинг. курсовая работа [14,7 K], добавлен 08.08.2009
Інструменти середовища C++Builder, які були використані в програмі. Робота з файлами, їх відкриття, відображення та закриття. Розробка основних функцій для реалізації програми. Тестування програмного забезпечення. Блок-схема та алгоритм програми. курсовая работа [924,3 K], добавлен 14.01.2014
Копіювання або переміщення файлів через буфер обміну або за допомогою правої кнопки миші. Копіювання та переміщення файлів методом перетаскування. Пошукові мережеві системи. Організація пошуку інформації в мережі Iнтернет. Класифікація пошукових систем. контрольная работа [855,1 K], добавлен 29.01.2010
Методи роботи з операційною системою Windows: основні елементи інтерфейсу, механізми створення папки та ярлика. Призначення програми "Проводник". Алгоритм видалення, перейменування, копіювання файлів і папок. Критерії пошуку та структура вікна Windows. лабораторная работа [20,1 K], добавлен 13.12.2010
Розробка програми для синхронізації та резервного копіювання даних на основі функцій Windows API. Методи отримання шляхів папок. Синхронізація та резервне копіювання файлів або папок. Застосування основ мови програмування С, функцій Windows API. курсовая работа [366,5 K], добавлен 21.05.2019
Користування стандартним та форматованим вводом-виводом. Використання вводу та виводу аргументу. Розробка лінійних програм. Програми з розгалуженням, циклічні програми з регулярною змінною аргументу. Використання вказівників для роботи з масивами даних. курсовая работа [4,6 M], добавлен 27.02.2014
Методика управління каталогами та атрибутами файлів. Аналіз вихідних даних, вибір підходу та технології реалізації програмного продукту. Розробка узагальненого та деталізованих алгоритмів роботи програми, інтеграція компонентів та комплексне тестування. курсовая работа [2,8 M], добавлен 23.01.2012
Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д. PPT, PPTX и PDF-файлы представлены только в архивах. Рекомендуем скачать работу .

© 2000 — 2021



Програми копіювання файлів лабораторная работа. Программирование, компьютеры и кибернетика.
Объем Сочинения По Русскому Языку Огэ 2022
Пособие по теме Правовое положение общественных объединений в Республике Беларусь
Контрольная Работа По Драме Гроза 10 Класс
Жизненный Путь Человека Эссе
Курсовая работа по теме Разработка проекта комплексной защиты информации
Дипломная работа по теме Развитие творческих способностей подростков в условиях внеклассной работы
Распространение Прионных Болезней Реферат
Курсовая работа: Управление трудовыми ресурсами организации
Реферат: Canadian Relations And Law Essay Research Paper
Готический стиль архитектуры
Егэ Рус 2022 Сочинение
Практическая Работа Тема Определение
Контрольная работа по теме Архивное хранение документов
Дипломная работа по теме Учредительные договоры как источники Европейского права
Реферат: Диагностический анализ организации. Скачать бесплатно и без регистрации
Рабочего Места Реферат
Реферат: Рахование (Стамбул, Турецкая Республика)
Реферат: Соціологічне опитування
Реферат На Тему Лесные Ресурсы России И Их Роль В Народнохозяйственном Комплексе
Реферат: Правовые системы мира 3
Место упаковки в системе маркетинговых коммуникаций - Маркетинг, реклама и торговля курсовая работа
Формирование культурно-гигиенических навыков у детей дошкольного возраста - Педагогика контрольная работа
Политика, политическая власть и политическая система - Политология контрольная работа


Report Page