Національний технічний університет України
«Київський політехнічний інститут імені Ігоря Сікорського»
Алгоритмізація та програмування 2: Процедурне програмування
ЗВІТ
до лабораторної роботи № 1
«Файли: створення, запис, читання»
Варіант 16
Дата «23» лютого 2022
ЗАВДАННЯ:
1. Ознайомитись з основними функціями для роботи з файлами.2. У якості індивідуального завдання необхідно написати програмний код, що реалізує створення двовимірного квадратного масиву розмірністю SIZE; виконання початкової ініціалізації всіх елементів масиву; запис у файл початкових даних і значень всіх елементів двовимірного квадратного масиву; створює копію цього файлу з новим розширенням *.bak.3. Роздрукувати (вивести на екран) протокол виконання програмного коду.4. Вихідні дані вибрати за індивідуальними варіантами (див. Додаток B-1).
Варіант завданнь:
Лабораторна робота №7:
За варінатом 16 – з таблиці з рисунка 1 варіант 4.
/
Рисунок 1.
Теоритичні відомості:
Покажчик на файл (змінна-покажчик типу FILE *) – це покажчик на інформацію, що визначає різні параметри файлу, включаючи його ім'я, стан та поточну позицію. Вказівник на файл ідентифікує конкретний дисковий файл та використовується потоком для виконання операцій введення/виводу. Для читання або запису файлу програма використовує вказівник на файл. Файлова змінна (наприклад, файл) створюється наступним оператором:
FILE *file;
Операція, за допомогою якої програма вперше запитує доступ до файлу, називається відкриттям файлу. Звільнення файлу в кінці роботи зазвичай називається закриттям файлу.
Функція fopen() відкриває потік. Цією функцією керують три основні параметри: ім'я файлу, який слід відкрити, вид застосування файлу та вказівник на файл, повертається функцією.
Синтаксис: FILE * fopen (char * filename, char * mode);
Опис: функція fopen() відкриває файл, іменований параметром filename і пов'язує його з відповідним потоком stream. Функція fopen() повертає як результат адресний покажчик, який ідентифікуватиме потік stream у наступних операціях.
Файл може бути відкритий у таких режимах (mode):
r відкриття файлу лише для читання;
w створення файлу для запису;
а приєднання, відкриття для запису в кінець файлу або створення запису, якщо файл не існує;
r+ відкриття існуючого файлу для оновлення (читання та запису);
w+ створення нового файлу для зміни;
a+ відкриття для приєднання; відкриття (або створення, якщо файл не існує) для оновлення на кінець файлу.
Якщо файл відкривається або створюється в текстовому режимі, можна додати символ t до значення параметра mode (rt, w+t тощо); аналогічно, для специфікації бінарного режиму можна до значення параметра mode додати символ b (wb, a+b тощо).
Важливо: Функція exit() використовується для припинення роботи програми з появою помилки. Якщо exit() звернулися з функції, викликаної головною програмою, то припиняє роботу вся програма, а не лише ця функція. Особливістю exit() те, що вона закриває будь-які файли, відкриті функцією fopen(). Це робить вихід із програми коректним. Аргументом exit() є номер коду помилки, він може передаватися іншій програмі, якщо вихідна припинила роботу. Існує угода, що 0 вказує на нормальне завершення, а будь-яке інше значення сигналізує про помилки.
Блок копіювання даних:
while(feof(infile) == 0)
{
ch = getc(infile);
if(feof(infile) == 0) putc(ch, outfile);
}
Блок-схеми
Повна програма:
/
Рисунок 2.
Вивід програми:
/
Рисунок 3.
/
Рисунок 4.
/
Рисунок 5.
/
Рисунок 6.
Код програми:
Посилання на Repl.it:
https://replit.com/join/obofrnarer-tr-15khavkin
#include<stdio.h>
#include <stdlib.h>
//Зчитування вхідних данних з командної строки
int main(int argc, char *argv[]){
if(argc != 50) {
printf("За варіантом потрібно 49 елементів, помилка, зупинка програми\n");
exit(1);
}
printf("Зчитування с командного рядка було успішним, продовження роботи програми");
//Створення, ініціалізація та присвоення массива його значень з командної строки
float arr[7][7];
int count=1;
printf("\nІніціалізація вхідного двовимірного массиву\n");
for(int i=0; i<7; i++){
for(int j=0; j<7; j++){
arr[i][j]=atof(argv[count]);
printf("\t%.2f\t", arr[i][j]);
count++;
}
printf("\n");
}
FILE *stream, *infile, *outfile;
char ind[128];
char name[128];
int var;
//Ввод початкових данних
printf("\n\nВведіть початкові дані\n");
printf("Індекс академіної групи: ");
scanf("%s", ind);
printf("Прізвище студента: ");
scanf("%s", name);
printf("Варіант: ");
scanf("%d", &var);
stream = fopen("dir/Lab1.txt","w+");
//Запис данних у створений файл
fprintf(stream,"Початкові дані:\nКПІ ім. Ігоря сікорського\nКафедра АПЕПС\nІндекс группи: %s\nПрізвище студента: %s\nНомер варіанту: %d\n", ind, name, var);
fprintf(stream, "Вхідний масив:\n");
for(int i=0; i<7; i++){
for(int j=0; j<7; j++){
fprintf(stream, "%f ", arr[i][j]);
}
}
fclose(stream);//Збереження та закритя файлу
printf("Дані збережені успішно");
//Відкриття файлу який копіюють і файла який копіює
if((infile = fopen("dir/Lab1.txt", "rb")) == NULL)
{
printf("Вихідний файл не був відкрит");
return 1;
}
if((outfile = fopen("dir/Lab1.bak", "wb")) == NULL)
{
printf("Вхідний файл не був відкрит");
return 1;
}
char ch;
//Копіювання файлу
while(feof(infile) == 0)
{
ch = getc(infile);
if(feof(infile) == 0) putc(ch, outfile);
}
printf("\nДані скопійовані успішно");
fclose(outfile);
fclose(infile);
return 0;
}
Висновок:
У цій лабораторної роботі ознайомилися з основними функціями для роботи з файлами, а також основний блок для копіювання файлу посимвольно. Було створено програмний код для створення, ініціалізації двовимірного квадратного масиву, створення файлу та запис у файл початкових даних і значень всіх елементів. Також код створює додатковий файл з розширенням *bak, у який попередній файл. Створенні блок-схема до коду. Зроблено звіт з лабораторної роботи та вчасно надіслано викладачу на перевірку.