Esercizio file di testo

di thomas99 il
6 risposte
Salve, ho realizzato questo programma:
Leggere il contenuto del file di testo, di nome “file.txt”.
Stampare a video un carattere ogni 3 di quelli letti.
Stampare a video il numero di caratteri ‘f’ presenti tra i caratteri stampati.
Il contenuto del file di testo è ifiuwerfhuwerfhow

Perchè la funzione ContaNumeroEffePresenti mi restituisce sempre zero?

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

void LetturaFile(FILE **fp);
void StampaUnCarattereOgniTre(FILE *fp);
void StampaNumeroEffePresenti(FILE *fp);
int ContaNumeroEffePresenti(FILE *fp);
void StampaEsitoNegativo();

int main(void){
	FILE *fp;

	LetturaFile(&fp);
	StampaUnCarattereOgniTre(fp);
	StampaNumeroEffePresenti(fp);

	system("pause");
	return 0;
}

void LetturaFile(FILE **fp){
	if((*fp = fopen("file.txt","r")) == NULL){
		StampaEsitoNegativo();
	}
	return;
}

void StampaUnCarattereOgniTre(FILE *fp){
	char car;
	int i = 0;
	printf("Stampa di un carattere ogni tre> ");
	while (!feof(fp)){
		fscanf(fp, "%c", &car);        //oppure car = fgetc(fp);
		if ((i % 3) == 0 || i == 0){
			printf("%c",car);
		}
		i++;

	}
	printf("\n");
	return;
}

void StampaNumeroEffePresenti(FILE *fp){
	int num = ContaNumeroEffePresenti(fp);

	printf("Numero delle f> %d\n",num);
	return;
}

int ContaNumeroEffePresenti(FILE *fp){
	char car;
	int num = 0;
	while (!feof(fp)){
		fscanf(fp, "%c", &car);
		if (car == 'f'){
			num = num + 1;
		}
	}
	return num;
}

void StampaEsitoNegativo(){
	printf("Errore File\n");

	return;
}

6 Risposte

  • Se sei uscito da StampaUnCarattereOgniTre() vuol dire che sei alla fine del file...

    E comunque fai pure tutto nel main(), quando funziona tutto - solo dopo! - fai refactoring del tuo codice con le funzioni. Dopotutto stai imparando, quindi sei autorizzato a non produrre soluzioni ottimali
  • E come faccio a riportarmi all'inizio del file?
  • Ho risolto così ma non so se è la soluzione più ottimale:
    #include <stdlib.h>
    #include <stdio.h>
    
    void LetturaFile(FILE **fp);
    void StampaUnCarattereOgniTre(FILE *fp);
    void StampaNumeroEffePresenti(FILE *fp);
    int ContaNumeroEffePresenti(FILE *fp);
    void StampaEsitoNegativo();
    
    int main(void){
    	FILE *fp;
    
    	LetturaFile(&fp);
    	StampaUnCarattereOgniTre(fp);
    	fclose(fp)
    	LetturaFile(&fp);
    	StampaNumeroEffePresenti(fp);
    	fclose(fp);
    	
    	system("pause");
    	return 0;
    }
    
    void LetturaFile(FILE **fp){
    	if((*fp = fopen("file.txt","r")) == NULL){
    		StampaEsitoNegativo();
    	}
    	return;
    }
    
    void StampaUnCarattereOgniTre(FILE *fp){
    	char car;
    	int i = 0;
    	printf("Stampa di un carattere ogni tre> ");
    	while (!feof(fp)){
    		fscanf(fp, "%c", &car);        //oppure car = fgetc(fp);
    		if ((i % 3) == 0 || i == 0){
    			printf("%c",car);
    		}
    		i++;
    
    	}
    	printf("\n");
    	return;
    }
    
    void StampaNumeroEffePresenti(FILE *fp){
    	int num = ContaNumeroEffePresenti(fp);
    
    	printf("Numero delle f> %d\n",num);
    	return;
    }
    
    int ContaNumeroEffePresenti(FILE *fp){
    	char car;
    	int num = 0;
    	while (!feof(fp)){
    		fscanf(fp, "%c", &car);
    		if (car == 'f'){
    			num = num + 1;
    		}
    	}
    	return num;
    }
    
    void StampaEsitoNegativo(){
    	printf("Errore File\n");
    
    	return;
    }
  • Ho provato a modificare la funzione StampaUnaStringaOgniTre() in modo tale che deve saltare sia gli spazi che gli '\n' e per scrivere lo spazio in C ho visto la tabella ASCII e ho visto che sia il numero 255 che il numero 32 corrispondono allo spazio.
    Se inserisco il numero 255 la funzione non funziona correttamente mentre se inserisco il 32 tutto funziona bene. Perchè?
  • L'ASCII ufficiale è a 7 bit e va da 0 a 127. Le estensioni a 8 bit sono diverse. 255 può essere 'ÿ' o qualcos'altro, di certo non spazio perché non avrebbe senso usare un altro codice per qualcosa già assegnato... magari non hanno assegnato niente nella tabella che hai visto tu perché è il valore di default di un byte in una flash vergine
Devi accedere o registrarti per scrivere nel forum
6 risposte