/*
Nome: Mario
Cognome: Montanari
Classe: 3AIN
Data: 21/03/2025

Realizzare una funzione per ciascuna delle seguenti richieste:
   - visualizzare a schermo il file “vmware.log” un carattere per volta 
     (dopo averla provata disabilitarne la chiamata);
   - copiare ogni carattere nel file “copia.txt”;
   - cambiare nome  “copia.txt” → “log.txt”;
   - cancellare “log.txt”;
   - utilizzare i comandi “pause” e “dir” del SO per seguire l'esecuzione delle funzioni 
     (sugg: creare una funzione “pausa”);
   - copiare 100 caratteri (se ci sono..) nel file “copia100.dat”;
   - (aprirlo con hexed e con il blocconote);
   - aggiungere a “copia100.dat” “BY: ” + “<il tuo cognome>” in una nuova linea
     (controllare con hexed).

*/

#include <iostream>
#include <stdio.h>
#include <stdlib.h>

using namespace std;

void leggiFileCaratterePerCarattere(const char *nomeFile) {
	FILE *fp = fopen("vmware.log", "rt");

	if (fp != NULL) {
		int chr;

		while ((chr = fgetc(fp)) != EOF) {
			cout << (char)chr;
		}

		fclose(fp);
	} else {
		perror("Error (source)");
	}
}

int cambiaNomeFile(const char *vecchioNome, const char *nuovoNome) {
	rename(vecchioNome, nuovoNome);

	printf("Il nome del file e' stato cambiato da '%s' a '%s'\n", vecchioNome, nuovoNome);

	return 0;
}

int cancellaFile(const char *nomeFile) {
	remove(nomeFile);

	printf("Il file '%s' e' stato eliminato con successo.\n", nomeFile);

	return 0;
}


void copiaFileCaratterePerCarattere(const char* nomeFileOrigine, const char* nomeFileDestinazione) {
	FILE* fileOrigine = fopen(nomeFileOrigine, "r");
	if (fileOrigine != NULL) {
		
		FILE* fileDestinazione = fopen(nomeFileDestinazione, "w");
		if (fileDestinazione != NULL) {
			int chr;
		
			while ((chr = fgetc(fileOrigine)) != EOF) {
				fputc(chr, fileDestinazione);
			}
			
			fclose(fileDestinazione);
		} else {
			perror("Error (destination)");
		}
		fclose(fileOrigine);
	} else {
		perror("Error (source)");
	}
}

void pausa() {
	system("pause");
	system("dir");
	system("pause");
}

void copiaPrimi100Caratteri(const char* nomeFileSorgente, const char* nomeFileDestinazione) {
	FILE* fileSorgente = fopen(nomeFileSorgente, "r");
	if (fileSorgente != NULL) {
		
		FILE* fileDestinazione = fopen(nomeFileDestinazione, "w");
		if (fileDestinazione != NULL) {
			int chr;

			for (int i = 0; i < 100; i++) {
				chr = fgetc(fileSorgente);
				fputc(chr, fileDestinazione);
			}

			fclose(fileDestinazione);
		} else {
			perror("Error (destination)");
		}
		fclose(fileSorgente);
	} else {
		perror("Error (source)");
	}
}

aggiungiStringa(const char* nomeFile, const char* nome) {
	FILE *fp = fopen(nomeFile, "at");

	if (fp != NULL) {
		fputs("\nBY: ", fp);
		fputs(nome, fp);
		fclose(fp);
	} else {
		perror("Error (source)");
	}
}


int main() {
	leggiFileCaratterePerCarattere("vmware.log");
	
	pausa();
	
	copiaFileCaratterePerCarattere("vmware.log", "copia.txt");
	
	pausa();
	
	cambiaNomeFile("copia.txt", "log.txt");
	
	pausa();
	
	cancellaFile("log.txt");
	
	pausa();
	
	copiaPrimi100Caratteri("vmware.log", "copia100.dat");
	
	aggiungiStringa("copia100.dat", "Mario Montanari");
	
	return 0;
}