/*
AUTORE: Manuel Vichi 3^AIN
Esercizio 2 File Binari
*/
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
#include <time.h>
using namespace std;
void initializeArray(int array[], size_t size) {
	//size_t size = sizeof(array) / sizeof(array[0]);
	for (size_t i = 0; i < size; i++) {
		array[i] = 0;
	}
}
int readBinary(char * const fileName, int buffer[], size_t count) {
	FILE* file = fopen(fileName, "rb");
	if (file == NULL) {
		perror("Errore nell'apertura del file di lettura");
		return -1;
	} else {
		fseek(file,0,SEEK_SET);
		int read = fread(buffer,sizeof(int),count,file);
		fclose(file);
		return read;
	}
	return -1;
}
int readSpecific(char * const fileName, int &buffer, unsigned index) {
	FILE* file = fopen(fileName, "rb");
	if (file == NULL) {
		perror("Errore nell'apertura del file di lettura");
		return -1;
	} else {
		unsigned n = (index-1);
		fseek(file,n * sizeof(int),SEEK_SET);
		int read = fread(&buffer,sizeof(int),1,file);
		fclose(file);
		return read;
	}
	return -1;
}
int readBeforeLast(char * const fileName, int &buffer) {
	FILE* file = fopen(fileName, "rb");
	if (file == NULL) {
		perror("Errore nell'apertura del file di lettura");
		return -1;
	} else {
		fseek(file,-sizeof(int),SEEK_END);
		int read = fread(&buffer,sizeof(int),1,file);
		fclose(file);
		return read;
	}
	return -1;
}
int readRandom(char * const fileName, int &buffer, unsigned count_max) {
	FILE* file = fopen(fileName, "rb");
	if (file == NULL) {
		perror("Errore nell'apertura del file di lettura");
		return -1;
	} else {
		srand(time(NULL));
		unsigned n = rand() % (count_max + 1);
		fseek(file,n * sizeof(int),SEEK_SET);
		int read = fread(&buffer,sizeof(int),1,file);
		fclose(file);
		return read;
	}
	return -1;
}
int main(void) {
	char file[] = "file_200.bin";
	//char file[] = "file.txt";
	int arr[200];
	int num = 0,numlast = 0,random = 0;
	size_t count = sizeof(arr) / sizeof(arr[0]);
	initializeArray(arr,count);
	printf("Valori letti dal file %s: %d\n",file,readBinary(file,arr,count));
	printf("Valori letti dal file %s: %d\n",file,readSpecific(file,num,2));
	printf("Valori letti dal file %s: %d\n",file,readBeforeLast(file,numlast));
	printf("Valori letti dal file %s: %d\n",file,readRandom(file,random,count));
	printf("Lettura completa: ");
	for (size_t i = 0; i < count; i++) {
		printf("%d ", arr[i]);
	}
	printf("\n");
	printf("Risultato lettura specifica: %d\n",num);
	printf("Risultato lettura penultimo elemento: %d\n",numlast);
	printf("Risultato lettura casuale: %d\n",random);
	return 0;
}
