Розв'язування на С задач, які використовують файли для вводу та виводу даних

Інформація про навчальний заклад

ВУЗ:
Національний університет Львівська політехніка
Інститут:
Не вказано
Факультет:
КН
Кафедра:
Кафедра ЕОМ

Інформація про роботу

Рік:
2014
Тип роботи:
Лабораторна робота
Предмет:
Основи алгоритмізації та програмування

Частина тексту файла (без зображень, графіків і формул):

Міністерство освіти і науки Національний університет “Львівська політехніка” Кафедра ЕОМ / Звіт з лабораторної роботи № 7 з дисципліни: “Основи алгоритмізації та програмування” на тему: “Розв'язування на С задач, які використовують файли для вводу та виводу даних” Мета лабораторної роботи Познайомитися iз засобами файлового вводу та виводу в мовi програмування С. Теоретичні відомості Файловий ввід та вивід З точки зору програми на мові С всі типи файлів при виконанні операцій вводу та виводу розглядаються як потік логічних даних незалежно від того чи програма читає (записує) символ чи байт, чи рядок даних, чи блок даних заданого розміру. Потоки в С можуть бути або текстовими потоками або бінарними потоками. При відкриванні файла з допомогою функції fopen( ) створює новий потік, який існує до тих пір доки не буде закритий з допомогою функції fclose( ). В мові С виконання операцій вводу-виводу делегується виконавчому середовищу (операційній системі) у якому виконується програма. Таким чином потік є каналом через який дані можуть передаватися з виконавчого середовища в програму чи з програми у виконавче середовище. Операції вводу-виводу з пристроями виконуються таким самим чином як і з файлами. Текстовий потік транспортує символи тексту, які складаються з рядків (розділені на рядки). Рядки тексту складаються з послідовності символів, які завершуються символом нового рядка (керуючим символом). Рядок може бути і порожнім. Бінарний потік є послідовністю байтів, які жодним чином не інтерпретуються і передаються без модифікації. У бінарному потоці не виділяють жодних керуючих символів. Дані записані в бінарний потік можуть бути знову прочитані у такими ж як були записані. Файли в С представляються послідовністю байтів. Функція fopen( ) зв'язує файл з потоком і ініціалізує об'єкт типу FILE, який містить всю необхідну інформацію для управління потоком. Ця інформація включає вказівник на використовуваний буфер, індикатор поточної позиції у файлі та інші. Функція fopen( ) повертає вказівник на об'єкт FILE потоку, який пов'язаний з відкритим файлом. Після відкриття файла з ним можна виконувати функції, які виконують читання-запис даних. Ці функції мають вказівник на об'єкт FILE як один із аргументів. Прототип стандартної бібліотечної функції fopen( ) наступний FILE *fopen( const char * filename, const char * mode ); Функція відкриває файл з іменем, який задається рядком filename. Параметр filename може містити і частину, яка специфікує каталог. Другий аргумент, mode, також є рядком і задає режим доступу. Цей аргумент вказує, які операції допустимі з файлом. Найважливішими є наступні значення цього аргументу: "rb" - читання з бінарного потоку "wb" - запис в бінарний потік "rt" - читання з текстового потоку "wt" - запис в текстовий потік Для закривання фала використовується функція fclose( ). Її прототип: int fclose( FILE *fp ); Функція скидає дані, якщо вони ще залишилися в буфері в файл, закриває файл і звільняє пам'ять, яку займали буфери вводу-виводу. Функція fclose( ) повертає нуль при успішному завершенні чи EOF, якщо станеться помилка. Для читання символів використовується функція int fgetc( FILE * fp ); Функція fgetc( ) читає символ з вхідного потоку на який посилається fp. Вона повертає прочитаний символ чи EOF, якщо станеться помилка. Запис окремого символу в потік здійснюється з допомогою функції int fputc( int c, FILE *fp ); Функція fputc( ) записує символ, який задається аргументом c у вихідний потік на який посилається fp. Вона повертає записаний символ чи EOF, якщо станеться помилка. Читання рядка з потоку виконується функцією char *fgets( char *buf, int n, FILE *fp ); Функція fgets( ) читає до n - 1 символів з вхідного потоку, на який посилається fp в буфер, який адресується buf, додаючи нуль-символ для завершення рядка. Якщо функція виявить символ нового рядка чи кінець файла перед тим як прочитає максимальну кількість символів, то лише вони будуть прочитані в буфер. Символ нового рядка '\n' також поміщається в буфер (якщо буде прочитаний). Функція повертає її аргумент buf чи нуль-вказівник при помилці чи якщо відстуні символи при досягненні кінця файла. Запис рядка, що завершується нуль-символом в потік виконується функцією int fputs( const char *s, FILE *fp ); fputs( ) записує рядок s у вихідний потік, на який посилається fp. Нуль-символ, який завершує рядок у вихідний потік не записується. Функція повертає EOF, якщо трапиться помилка, чи невід'ємне значення при успішному завершенні. Функція fread( ) читає до n об'єктів, розмір яких size із вхідного потоку на який посилається fp і поміщає їх в масив buffer size_t fread( void *buffer, size_t size, size_t n, FILE *fp ); Функція повертає кількість прочитаних об'єктів. Якщо це значення є меншим за аргумент n, то це вказує, що був досягнутий кінець файла чи сталася помилка. Функція fwrite( ) посилає n об'єктів розміром size з масиву buffer у вихідний потік на який посилається fp size_t fwrite( const void *buffer, size_t size, size_t n, FILE *fp ); Як і попередня функція вона повертає кількість записаних об'єктів. Якщо це значення є меншим за аргумент n, то це вказує, що сталася помилка. З допомогою сімейства функцій printf( ) в мові С забезпечується форматований вивід. Для роботи з файлами використовується функція fprintf( ) int fprintf( FILE * fp, const char * format, ... ); Ця функція працює так само як і функція printf( ) за винятком того, що здійснює вивід у вихідний потік на який посилається fp. Аналогічно, сімейство функцій scanf( ) служить для форматованого вводу. Для вводу з файлу служить функція fscanf( ). int fscanf( FILE * fp, const char * format, ... ); Функція читає з вхідного потоку, на який посилається fp. Решта параметрів такі ж як і у функції scanf( ). Індивідуальне завдання 5-3. Задані дійсні числа x1, x2, … , x25. Знайти три найбільших серед них. Хід виконання роботи Використовуючи вище приведений опис та документацію з мови програмування С, познайомитися зі засобами вводу з файлів та виводу у файл в мові програмування С. З допомогою вбудованого текстового редактора підготувати тексти програм, у яких використовуються функції роботи з файлами, відлагодити їх та отримати результати роботи програм. Тексти програм 5-3 (txt) #include <stdio.h> int ArrMaxPos(int arr[], int size) { int Max; int i, pos; Max = arr[0]; pos = 0; for (i = 1; i < size; i++) if (arr[i] > Max) { Max = arr[i]; pos = i; } return pos; } int main() { FILE *in, *out; int m[25]; fopen_s(&in, "../Debug/in.txt", "rt"); for (int i = 0; i < 25; i++) { fscanf_s(in, "%d", &m[i]); printf("%d ", m[i]); } fclose(in); fopen_s(&out, "../Debug/out.txt", "wt"); printf("\nmax: "); for (int i = 3, k; i > 0; i--) { k = ArrMaxPos(m, 25); printf("%d ", m[k]); fprintf(out, "%d ", m[k]); m[k] = 0; } fclose(out); getch(); return 0; } 5-3 (bin) Write #include <stdio.h> int main() { FILE *in; int m[25]; srand(time(NULL)); fopen_s(&in, "../Debug/in.bin", "wb"); for (int i = 0; i < 25; i++) { m[i] = rand() % 1000; printf("%d ", m[i]); fwrite(&m[i], sizeof(int), 1, in); } fclose(in); getch(); return 0; } Main Program #include <stdio.h> int ArrMaxPos(int arr[], int size) { int Max; int i, pos; Max = arr[0]; pos = 0; for (i = 1; i < size; i++) if (arr[i] > Max) { Max = arr[i]; pos = i; } return pos; } int main() { FILE *in, *out; int m[25]; fopen_s(&in, "../Debug/in.bin", "rb"); for (int i = 0; i < 25; i++) { fread(&m[i], sizeof(int), 1, in); printf("%d ", m[i]); } fclose(in); fopen_s(&out, "../Debug/out.bin", "wb"); printf("\nmax: "); for (int i = 3, k; i > 0; i--) { k = ArrMaxPos(m, 25); printf("%d ", m[k]); fwrite(&m[k], sizeof(int), 1, out); m[k] = 0; } fclose(out); getch(); return 0; } Read #include <stdio.h> int main() { FILE *out; int m[25]; fopen_s(&out, "../Debug/out.bin", "rb"); for (int k = 0; k < 3; k++) { fread(&m[k], sizeof(int), 1, out); printf("%d ", m[k]); } fclose(out); getch(); return 0; } Результати роботи програм 5-3 (txt) / / 5-3 (bin) Main Program / Read / Висновок Я познайомився iз засобами файлового вводу та виводу в мові програмування С. Я написав програму, в якій ввід здійснюється з текстового файлу і вивід виконується в текстовий файл, та програму, в якій ввід здійснюється з бінарного файлу і вивід відбувається в бінарний файл.
Антиботан аватар за замовчуванням

27.03.2016 18:03-

Коментарі

Ви не можете залишити коментар. Для цього, будь ласка, увійдіть або зареєструйтесь.

Ділись своїми роботами та отримуй миттєві бонуси!

Маєш корисні навчальні матеріали, які припадають пилом на твоєму комп'ютері? Розрахункові, лабораторні, практичні чи контрольні роботи — завантажуй їх прямо зараз і одразу отримуй бали на свій рахунок! Заархівуй всі файли в один .zip (до 100 МБ) або завантажуй кожен файл окремо. Внесок у спільноту – це легкий спосіб допомогти іншим та отримати додаткові можливості на сайті. Твої старі роботи можуть приносити тобі нові нагороди!
Нічого не вибрано
0%

Оголошення від адміністратора

Антиботан аватар за замовчуванням

Подякувати Студентському архіву довільною сумою

Admin

26.02.2023 12:38

Дякуємо, що користуєтесь нашим архівом!