Jump to content

[Structuri de Date - C] Fișiere & Articole (Partea 2)


Soulrayne
 Share

Recommended Posts

Obiectiv

 

Prin acest tutorial , dorim , pe baza proiectul actual , sa printam rezultatele atat intr-un fisier text (inteles de utilizator)  cat si binar (inteles de catre calculator) .

 

Implementare

 

1. In Contextul "fileHandling" , definim doua CONSTANTE (Pentru Scriere in Binar si in Fisier Text) si doua functii pentru validarea unui fisier dar si pentru eliberarea colectiilor de fisiere (+ inchiderea fiecarui fisier care face parte)

 

// fileHandling.h

#include "stdlib.h" // pentru malloc/free 

#define  WRITEMODE_TXT    "w" // CONSTANTA SCRIERE IN FISIERE TEXT (IN)EXISTENTE IN DIRECTOR 
#define  WRITEMODE_BINARY "wb" // CONSTANTA SCRIERE IN FISIERE BINARE (IN)EXISTENTE IN DIRECTOR 

int checkFile(FILE* file); // validam fisierul 
void closeFiles(FILE*** files, const unsigned nrFiles); // Preluam prin adresa colectia de fisiere + numarul acestora 

// ++ RESTU DE FISIER 

 

Implementarea Acestora : 

 

// fileHandling.c

// Restu de fisier 

int checkFile(FILE* file)
{
	return file ? 1 : 0; // VERIFICAM DACA FISIERUL EXISTA IN MEMORIE 
}

void closeFiles(FILE*** files,const unsigned nrFiles) // Eliberam colectia de fisiere 
{
	for (int i = 0; i < nrFiles; i++)
		fclose((*files)[i]); // Eliberam fiecare fisier 

	// Eliberam colectia de fisiere 

	free(*files);
	*files = NULL;
}

 

2. In Contextul "roles" , declaram numele fisierelor pe care dorim sa le operam (scriere) dar si functiile de afisare in fisiere a rolurilor : 

 

// roles.h

// ++ restu de fisier

#include "fileHandling.h"

#define FILENAME_OUTPUT_ROLES           "dateIesireRoluriBZONE.txt" 
#define FILENAME_OUTPUT_ROLES_BINARY    "dateIesireRoluriBZONE.bin"

// Functiile pentru afisare 

void showRolesOnFile(Role* roles, FILE* rolesOuputText);
void writeRolesOnBinaryData(Role* roles, FILE* rolesOutputBinary);

 

Si Implementarile acestora : 

 

//roles.c

// ++ Restu de fisier 

void showRolesOnFile(Role* roles, FILE* rolesOuputText)
{
	// fprintf_s --> este functia care ne permite sa scriem in fisiere 

	if (!checkFile(rolesOuputText) || roles == NULL) // Avem un fisier invalid  
		return; // NU CONTINUAM 

	//Daca e ok 

	unsigned i = 0; 

	fprintf_s(rolesOuputText," Colectia de Roluri : { \n");

	do {  // Parcurgem colectia de roluri 
		fprintf_s(rolesOuputText,"ID ROL : %d \t NUME ROL : %s\n", roles[i].id, roles[i].nameRole);
		i++;
	} while (!roles[i - 1].isLastRole);

	fprintf_s(rolesOuputText," } \n\n");
}

void writeRolesOnBinaryData(Role* roles, FILE* rolesOutputBinary)
{
	if (!checkFile(rolesOutputBinary) || roles == NULL) // FACEM O VALIDARE ATAT FISIERULUI CAT SI STRUCTURII 
		return;  // NU CONTINUAM 

	// Daca e ok , transcriem structura in fisier : 

	// fwrite() --> este functia pentru scrierea entitatilor in binar
	// 
	unsigned i = 0; 

	do {  // Parcurgem colectia de roluri 
		fwrite(&roles[i].id,sizeof(int),1,rolesOutputBinary); // Trecem in binar id-ul 
		fwrite(roles[i].nameRole,sizeof(char),strlen(roles[i].nameRole), rolesOutputBinary); // Trecem numele rolului in binar 
		i++;
	} while (!roles[i - 1].isLastRole);
}

 

Rezultate

 

In functia principala , vom initializa colectia cu fisierele asociate , vom afisa rolurile atat in consola cat si in fisierele binare/text . La final , le vom elibera din memorie 

 

/* Legam toate entry point toate headerele dependente */
#include "../StructuriDate/roles.h" 
#include "../StructuriDate/fileHandling.h"

// stringHandling.h nu este dependent de entry point
// 

// CONSTANTELE MACRO SUNT UTILE CA LE PUTEM UTILIZA LA NIVEL GLOBAL (PE TOT FISIERUL)
// NOTA** :  E O PRACTICA BUNA DE A FOLOSI MACRO SPRE DEOSEBIRE DE CONSTANTE "MAGICE" (NUMERE PRIN COD)

#define NR_FILES   3  // STABILIM UN NUMAR DE FISIERE


int main()
{
	FILE** file = NULL; 

	file = (FILE**)malloc(sizeof(FILE*)*NR_FILES); // DECLARAM O COLECTIE DE FISIERE 

	file[0] = openFile(FILENAME_INPUT_ROLES, READMODE_TXT); // CITIM ROLURILE DINTR-UN FISIER TEXT 
	file[1] = openFile(FILENAME_OUTPUT_ROLES, WRITEMODE_TXT); // SCRIEM ROLURI INTR-UN FISIER TEXT 
	file[2] = openFile(FILENAME_OUTPUT_ROLES_BINARY, WRITEMODE_BINARY); // SCRIEM ROLURI INTR-UN FISIER TEXT 


	// dateIntrareBZONE.txt && dateIntrareRoluriBZONE.txt TREBUIE SA EXISTE IN DIRECTOR (ALTFEL VA ESUA)

	Role* roles = fetchRoles(file[0]); // Am primit lista cu rolurile 
 
	showRoles(roles); // Afisam Rolurile 

	showRolesOnFile(roles, file[1]); // Le afisam intr-un fisier text 
	writeRolesOnBinaryData(roles,file[2]); // Le afisam intr-un fisier binar 


	// ELIBERAM RESURSELE 

	freeRoles(&roles); // Eliberam resursele ocupate de entitate 
	closeFiles(&file,NR_FILES); // Eliberam resursele ocupate de fisiere 

	if (file == NULL)
		printf("COLECTIA DE FISIERE A FOST ELIBERATA CU SUCCES !! ");


	return 0;
}

 

Rezultatul in consola : 

 

**FISIERUL dateIntrareRoluriBZONE.txt S-A DESCHIS CU SUCCES !**

// Astea doua SUNT GENERATE DE PROGRAM !! 

**FISIERUL dateIesireRoluriBZONE.txt S-A DESCHIS CU SUCCES !**
**FISIERUL dateIesireRoluriBZONE.bin S-A DESCHIS CU SUCCES !**
 Colectia de Roluri : {
ID ROL : 0       NUME ROL :  Membru

ID ROL : 1       NUME ROL :  Utilizator Premium

ID ROL : 2       NUME ROL :  Moderator

ID ROL : 3       NUME ROL :  Super Moderator

ID ROL : 4       NUME ROL :  Administrator
 }

COLECTIA DE FISIERE A FOST ELIBERATA CU SUCCES !!

 

NOTA 1 : In atasament , veti putea vizualiza rezultatele atat in fisier binar cat si text !! 

NOTA 2 : Fisierele careia li se aplica operatiunea de scriere , sunt GENERATE DE PROGRAM DACA NU EXISTA IN DIRECTOR !! 

NOTA 3 :  ACESTE CODURI SUNT DOAR ADAUGIRI(ADAPTARI) DE LA CODUL REGASIT IN TUTORIALUL ANTERIOR DE STRUCTURI !! 

 

Fisier .txt

https://easyupload.io/w2pisw

 

Fisier .bin

https://easyupload.io/95e5sb

 

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.