Esercizio file di testo

di il
6 risposte

Esercizio file di testo

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

  • Re: Esercizio file di testo

    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
  • Re: Esercizio file di testo

    E come faccio a riportarmi all'inizio del file?
  • Re: Esercizio file di testo

    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;
    }
  • Re: Esercizio file di testo

    Va bene chiudere e riaprire.
    In alternativa c'è fseek()
    http://www.cplusplus.com/reference/cstdio/fseek
  • Re: Esercizio file di testo

    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è?
  • Re: Esercizio file di testo

    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