/*
Nome: Mario
Cognome: Montanari
Classe: 3AIN
Data: 07/05/2025

1) Apre un file binario in modalità di lettura binaria ("rb"), 
2) Legge fino a 100 interi dal file e memorizza i valori letti
nell'array dati. 
3) Successivamente, stampa il numero effettivo di valori letti
utilizzando la funzione fread.
4) Testarlo:
      - sui file dell’es1
      - su un file di testo contenente “1234567\n”
5) Dai file "file_70.bin", "file_100.bin" e "file_200.bin”
6) Leggere il 30° valore
7) Leggere il 2° valore
8) Leggere il penultimo
9) Leggerne uno a caso
*/

#include <iostream>
#include <cstdlib>
#include <ctime>

#define DIM 100
#define VAL_MIN 0
#define VAL_MAX 100

using namespace std;

int main(void) {
	srand(time(NULL));
	
	FILE * file_70 = fopen("file_70.bin", "rb");
	FILE * file_100 = fopen("file_100.bin", "rb");
	FILE * file_200 = fopen("file_200.bin", "rb");
	FILE * file_7 = fopen("file_7.txt", "rt");
	
	if (file_70 != NULL && file_100 != NULL && file_200 != NULL && file_7 != NULL) {
		int dati_70[DIM] = {0};
		int dati_100[DIM] = {0};
		int dati_200[DIM * 2] = {0};
		
		
		// --- Lettura dei file binari ---
		int letti_70 = fread(dati_70, sizeof(int), DIM, file_70);
		int letti_100 = fread(dati_100, sizeof(int), DIM, file_100);
		int letti_200 = fread(dati_200, sizeof(int), DIM * 2, file_200);
		
		cout << "Valori letti da file_70.bin (" << letti_70 << "): ";
		for (int i = 0; i < letti_70; i++) {
			cout << dati_70[i] << " ";
		}
		cout << endl << endl;
		
		cout << "Valori letti da file_100.bin (" << letti_100 << "): ";
		for (int i = 0; i < letti_100; i++) {
			cout << dati_100[i] << " ";
		}
		cout << endl << endl;
		
		cout << "Valori letti da file_200.bin (" << letti_200 << "): ";
		for (int i = 0; i < letti_200; i++) {
			cout << dati_200[i] << " ";
		}
		cout << endl << endl;
		
		// --- Lettura del file di testo ---
		int x;
		int i = 0;
		
		cout << "Valori letti da file_7.txt: ";
		while (fscanf(file_7, "%d", &x) == 1 && i < DIM) {
			cout << x << endl;
			i++;
		}
		cout << "Totale valori letti dal file_7.txt: " << i << endl << endl;
		
		// --- Estrazione dei valori specifici ---
		if (letti_70 >= 30) {
			cout << "30esimo valore nel file_70.bin: " << dati_70[29] << endl;
		}
		if (letti_100 >= 30) {
			cout << "30esimo valore nel file_100.bin: " << dati_100[29] << endl;
		}
		if (letti_200 >= 30) {
			cout << "30esimo valore nel file_200.bin: " << dati_200[29] << endl;
		}
		cout << endl;
		
		if (letti_70 >= 2) {
			cout << "Secondo valore nel file_70.bin: " << dati_70[1] << endl;
		}
		if (letti_100 >= 2) {
			cout << "Secondo valore nel file_100.bin: " << dati_100[1] << endl;
		}
		if (letti_200 >= 2) {
			cout << "Secondo valore nel file_200.bin: " << dati_200[1] << endl;
		}
		cout << endl;
		
		if (letti_70 >= 2) {
			cout << "Penultimo valore nel file_70.bin: " << dati_70[letti_70 - 2] << endl;
		}
		if (letti_100 >= 2) {
			cout << "Penultimo valore nel file_100.bin: " << dati_100[letti_100 - 2] << endl;
		}
		if (letti_200 >= 2) {
			cout << "Penultimo valore nel file_200.bin: " << dati_200[letti_200 - 2] << endl;
		}
		cout << endl;
		
		// --- Valori casuali ---
		if (letti_70 > 0) {
			int casual = rand() % letti_70;
			cout << "Valore letto casualmente da file_70.bin: " << dati_70[casual] << endl;
		}
		if (letti_100 > 0) {
			int casual = rand() % letti_100;
			cout << "Valore letto casualmente da file_100.bin: " << dati_100[casual] << endl;
		}
		if (letti_200 > 0) {
			int casual = rand() % letti_200;
			cout << "Valore letto casualmente da file_200.bin: " << dati_200[casual] << endl;
		}
		
		fclose(file_70);
		fclose(file_100);
		fclose(file_200);
		fclose(file_7);
	} else {
		perror("Error");
	}
	
	return 0;
}