Problema con lettura parole da file

di
Anonimizzato25148
il
7 risposte

Problema con lettura parole da file

Ciao a tutti
Devo creare un programma in C che, dato un file txt contenente una serie di parole casuali (es gf lk n paa xi bdd sa), e dati due caratteri c1 e c2 (es, a e b), restituisca il numero di parole che hanno o il valore c1 o il valore c2 (nell'esempio deve restituire 3)
Sono arrivato a buon punto:


#include<stdio.h>
#include <stdbool.h>
#include <string.h>
#define L_STR 100

/*
IP descr Descrizione della stringa da leggere.
IK+OP strLetta Stringa letta.
*/
void readString(const char* descr, char* strLetta) {
    printf("%s", descr);
    scanf("%s", strLetta);
} /* readString */ 

/*
IP Nome del file da elaborare,.
OP contaPar: parole contenenti o c1 o c2;
OR Esito(!=-1: elaborazione riuscita e risultato; -1: apertura fallita di $nomeFI).
*/

int contaPar(const char*nomeFI, char c1, char c2){
	int cont=0;
	char ch[L_STR];
	printf("Inserisci c1\n");
	scanf(" %c",&c1);
	printf("Inserisci c2\n");
	scanf(" %c",&c2);
	FILE *inF;
	inF=fopen(nomeFI, "r"); 
    if (inF == NULL)
        return -1;
	while(true){
		if(feof(inF))
			break;
		fscanf(inF, "%s",&ch);
		printf("%s\n",ch);
		if(*ch==c1 || *ch==c2)
			cont++;
	}
	printf("parole: %d\n",cont);
	fclose(inF);
	return cont;
}

int main(){
	char nomeFI[L_STR],c1,c2;
	readString("Nome file:",nomeFI);
	int esito=contaPar(nomeFI,c1,c2);
	if(esito!=-1)
		printf("Il file e' stato aperto correttamente e le parole con c1 o c2 sono %d\n",esito);
	else
		printf("Apertura del file fallita");
	return 0;
}
	

Il codice è quasi giusto: restituisce il numero di parole che hanno c1 o c2 però solo come carattere iniziale (es riconosce ak ma non ka).
Come devo fare a far leggere l'intera stringa e non solo il primo carattere? Grazie

7 Risposte

  • Re: Problema con lettura parole da file

    Il problema è in

    if(*ch==c1 || *ch==c2)
    cont++;

    in cui controlli solo il primo carattere. Devi usare un ciclo e controllare tutti i caratteri del vettore fino al carattere di chiusura
  • Re: Problema con lettura parole da file

    Ho scritto così:
    for(i=0;i<N;i++){
    if(ch==c1 || ch==c2)
    cont++;
    }
    Ora però se la lettera appare due volte in una parola allora il contatore sale di due, mentre io voglio che salga solo di 1 (es con xaa deve aumentare di uno non di due)
  • Re: Problema con lettura parole da file

    Allora non ti serve un contatore, devi terminare il ciclo con un break quando trovi il carattere.
  • Re: Problema con lettura parole da file

    Ok, ora funziona
    for(i=0;i<N;i++){
    if(ch==c1 || ch==c2){
    cont++;
    break;
    }
    Grazie!
  • Re: Problema con lettura parole da file

    Ma cont non ti serve!
  • Re: Problema con lettura parole da file

    Scusate l'ignoranza ma a quel punto al posto di mettere il break per uscire non poteva mettere direttamente la condizione dell'if nel for (col not davanti)?
  • Re: Problema con lettura parole da file

    Avrebbe potuto, è equivalente ma è codice meno chiaro.
Devi accedere o registrarti per scrivere nel forum
7 risposte