/*
AUTORE: Manuel Vichi
Verifica di Informatica sui file binari
*/
#include <stdio.h>
#include <stdbool.h>
#include <stdint.h>
#include <stdlib.h>
typedef struct {
	int a;
	float b;
} Struct3;

typedef struct {
	char nome[12];
	int eta;
	float altezza;
} Struct6;

int main(void) {
	// Inizio del Programma: Apertura del file //
	FILE* file = fopen("file_3.txt","rb");
	if (file == NULL) {
		perror("Errore durante l'apertura del file in lettura");
		return -1;
	}
	// Esercizio 1 //
	rewind(file);
	fseek(file,295,SEEK_SET);
	int int1 = 0;
	fread(&int1,sizeof(int),1,file);
	printf("%d\n",int1);
	// Esercizio 2 //
	rewind(file);
	fseek(file,360,SEEK_SET);
	int offset2 = 0;
	fread(&offset2,sizeof(int),1,file);
	rewind(file);
	//printf("%d\n",offset2);
	fseek(file,offset2,SEEK_SET);
	int int2 = 0;
	fread(&int2,sizeof(int),1,file);
	printf("%d\n",int2);
	// Esercizio 3 //
	rewind(file);
	fseek(file,491,SEEK_SET);
	Struct3 struct3;
	fread(&struct3,sizeof(struct3),1,file);
	printf("%d %f\n",struct3.a,struct3.b);
	// Esercizio 4 //
	rewind(file);
	fseek(file,491,SEEK_SET);
	char stringa4[16];
	fread(&stringa4,sizeof(stringa4),1,file);
	printf("%s\n",stringa4);
	// Esercizio 6 //
	rewind(file);
	fseek(file,837,SEEK_SET);
	Struct6 struct6[10];
	fread(&struct6,sizeof(Struct6),10,file);
	FILE* file6 = fopen("file6.txt","wt");
	if (file6 == NULL) {
		perror("Errore durante l'apertura del file in scrittura");
		fclose(file);
		return -1;
	}
	for (int i = 0; i < 9; i++) {
		fprintf(file6,"%s %d %f\n",struct6[i].nome, struct6[i].eta, struct6[i].altezza);
	}
	fprintf(file6,"%s %d %f",struct6[9].nome, struct6[9].eta, struct6[9].altezza);
	fclose(file6);
	file6 = fopen("file6.txt","rb");
	uint8_t buffer[256];
	uint8_t checksum = 0;
	int read = fread(&buffer,sizeof(uint8_t),256,file6);
	if (read == 0) {
		perror("Errore durante la lettura");
		fclose(file);
		fclose(file6);
		return -1;
	}
	for (int i = 0; i < read; i++) {
		checksum += buffer[i];
	}
	printf("%d\n",checksum);
	fclose(file6);
	// Fine del programma: chiusura del file di lettura e scrittura dei risultati su un file txt //
	fclose(file);
	FILE* results = fopen("results.txt","wt");
	if (file == NULL) {
		perror("Errore durante l'apertura del file dei risultati");
		return -1;
	}
	fprintf(results, "int1: %d\n",int1);
	fprintf(results, "int2: %d\n",int2);
	fprintf(results, "a: %d; b : %f\n",struct3.a,struct3.b);
	fprintf(results, "stringa4: %s\n",stringa4);
	fprintf(results, "checksum: %d\n",checksum);
	fclose(results);
	return 0;
}
