School-Coding-Cpp/sfusi/es02_zoli_binaryfile.cpp

137 lines
3.8 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
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 delles1
- 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;
}