Міністерство освіти і науки
Національний університет „Львівська політехніка”
  Кафедра EОМ
  Звіт
  з лабораторної роботи №7  
 з дисципліни: “Основи алгоритмізації та програмування ”
«Розв'язування на С задач, які використовують файли для вводу та виводу даних»
          
                                                                2015
Мета роботи
познайомитися iз засобами файлового вводу та виводу в мовi програмування С.
Завдання лабораторної роботи
Індивідуальні завдання 8 ті ж самі що і індивідуальні завдання 5 чи індивідуальні завдання 6 (уточнити конкретне завдання у викладача), які виконувалися у лабораторній роботі №5. Відмінність полягає у тому, що ввід та вивід виконується через файли.
Необхідно написати два варіанти програми:
програма у якій ввід здійснюється з текстового файлу і вивід виконується в текстовий файл;
програма у якій ввід здійснюється з бінарного файлу і вивід відбувається в бінарний файл.
У бінарному файлі дані зберігаються у внутрішньому представлені.
Для варіанту, який використовує бінарні файли, необхідно написати дві допоміжні програми:
допоміжну програму яка формує бінарний файл із вхідними даними;
допоміжну програму яка читає вихідний бінарний файл і виводить на екран монітори вихідні дані.
Хід виконання роботи
Текст першої програми, яка працює з текстовими файлами. Для читання і запису створені окремі файли, розмір матриці як і раніше вводиться з клавіатури.
#include <stdio.h>
int FillingZeros(int *a, int array_size);
int main(void)
{
	int i, j;
	int cnt = 0, num = 1;
	int array_size;
	scanf("%d", &array_size);
	// Виділення пам'яті для матриці										  
	int **a = (int **)malloc(array_size*sizeof(int *));
	for (int i = 0; i < array_size; i++)
	{
		a[i] = (int *)malloc(array_size*sizeof(int));
	}
	// Відкриття потоку для вхідного файлу
	FILE *inp;
	inp = fopen("input.txt", "rt");
	if (inp == NULL) {
		printf("Input file no found\n");
		return 0;
	}
	// Відкриття потоку для вхідного файлу
	FILE *out;
	out = fopen("output.txt", "wt");
	FillingZeros(a, array_size);
	for (i = 0; i < (array_size / 2); i++)
	{
		cnt++;
		for (j = cnt; j < array_size - cnt; j++)
		{
			fscanf(inp, "%d", &num);
			a[i][j] = num;
		}
	}
	// Вибір початової позиції для заповнення другої половини матриці. 
	if (array_size % 2 == 0) cnt = (array_size / 2);
	else cnt = (array_size / 2) + 1;
	for (i = ((array_size / 2) + 1); i < array_size; i++)
	{
		cnt--;
		for (j = cnt; j < array_size - cnt; j++)
		{
			fscanf(inp, "%d", &num);
			a[i][j] = num;
		}
	}
	// Вивід матриці
	for (i = 0; i < array_size; i++)
	{
		for (j = 0; j < array_size; j++)
		{
			fprintf(out, "%d", a[j][i]);
			if (j == (array_size - 1)) fputc('\n', out);
		}
	}
	// Закриття всіх потоків
	fcloseall;
	return 0;
}
// Функція призначена для заповнення масиву нулями
int FillingZeros(int **a, int array_size)
{
	int i, j;
	for (i = 0; i < array_size; i++)
	{
		for (j = 0; j < array_size; j++)
		{
			a[i][j] = 0;
		}
	}
	return 0;
}
                                       
 Результат виконання програми:
/ /
     Рис. 1. Файл з вхідними даними              Рис.2. Матриця записана у файл
Програма успішно прочитала числа з файлу input.txt(рис.1), і записала результат виконання до файлу output.txt(рис.2) .
Друга програма складається з декількох файлів, файл «FileConversion.с» призначений для читання текстового файлу і переписування його вмісту до бінарного, файл «FillingZeros.c» заповнює матрицю яку ми обробляємо нулями, і файл «OutputFile.c» зчитує вміст вихідного бінарного файлу і виводить його вміст на екран. Головна програма здійснює зчитування і запис з бінарних файлів та перетворює матрицю.
 
Текст функції FileConversion:
#include <stdio.h>
#include "Matrix.h"
//Переписування вмісту текстового файлу до байтового
int FileConversion(void)
{
	int  num = 1;
	//Відкриття потоку для вхідного файлу у текстовому вигляді
	FILE *inp;
	inp = fopen("input.txt", "rt");
	if (inp == NULL) {
		printf("Input file no found\n");
	}
	// Відкриття потоку для вихідного файлу у бінарному вигляді
	FILE *out;
	out = fopen("input1.txt", "wb");
	// Цикл перенесення чисел з текстового файлу до бінарного
	while (fscanf(inp, "%d", &num) == 1)
	{
		putw(num, out);
	}
	fcloseall();
	return 0;
}
Текст функції FillingZeros:
#include <stdio.h>
#include "Matrix.h"
// Програма призначена для заповнення масиву нулями
int FillingZeros(int **a, int array_size)
{
	int i, j;
	for (i = 0; i < array_size; i++)
	{
		for (j = 0; j < array_size; j++)
		{
			a[i][j] = 0;
		}
	}
	return 0;
}
Текст функції OutputFile:
#include <stdio.h>
#include "Matrix.h"
// Вивід вмісту бінарного файлу на екран
int OutputFile(int array_size)
{
	int num, i;
	//Відкриття потоку для вхідного файлу у бінарному вигляді
	FILE *inp;
	inp = fopen("output.txt", "rb");
	if (inp == NULL) {
		printf("Input file no found\n");
	}
	// Цикл для зчитування матриці посимвольно
for ( i = 0; i < (array_size * array_size); i++)
	{
		if ((i % array_size) == 0) printf("\n");
		num = getw(inp);
		printf("%d ", num);
	}
		printf("\n\t\t");
	return 0;
}
Текст головної програми:
#include <stdio.h>
#include "Matrix.h"
int main(void)
{
	int i, j;
	int cnt = 0, num = 1;
	int array_size;
	scanf("%d", &array_size);
	FileConversion();
	// Виділення пам'яті для матриці										  
	int **a = (int **)malloc(array_size*sizeof(int *));
	for (int i = 0; i < array_size; i++)
	{
		a[i] = (int *)malloc(array_size*sizeof(int));
	}
	// Відкриття потоку для вхідного файлу
	FILE *inp;
	inp = fopen("input1.txt", "rb");
	if (inp == NULL) {
		printf("Input file no found\n");
		return 0;
	}
	// Відкриття потоку для вихідного файлу
	FILE *out;
	out = fopen("output.txt", "wb");
	FillingZeros(a, array_size);
	for (i = 0; i < (array_size / 2); i++)
	{
		cnt++;
		for (j = cnt; j < array_size - cnt; j++)
		{
			num = getw(inp);
			a[i][j] = num;
		}
	}
	// Вибір початової позиції для заповнення другої половини матриці. 
	if (array_size % 2 == 0) cnt = (array_size / 2);
	else cnt = (array_size / 2) + 1;
	for (i = ((array_size / 2) + 1); i < array_size; i++)
	{
		cnt--;
		for (j = cnt; j < array_size - cnt; j++)
		{
			num = getw(inp);
			a[i][j] = num;
		}
	}
	// Вивід матриці
	for (i = 0; i < array_size; i++)
	{
		for (j = 0; j < array_size; j++)
		{
			putw(a[j][i], out);
		}
	}
	fcloseall();
	OutputFile(array_size);
	// Закриття всіх потоків
	fcloseall();
	return 0;
}
        Результат виконання програми:
/
                     Рис.1. Вміст вхідного файлу у бінарному представленні.
/
                  Рис.2. Вміст вихідного файлу у бінарному представленні.
/
                              Рис.3. Результат зчитування вихідного файлу 
	Програма успішно переписала вміст вхідного файлу(рис.1), перетворила матрицю(рис.2), використовуючи бінарні файли і вивела вміст вихідного файлу на екран(рис.3).
Висновки
познайомився iз засобами файлового вводу та виводу в мовi програмування С.