Creazione "controllore ortografico"

di il
4 risposte

Creazione "controllore ortografico"

Buonasera.
Ho da svolgere per fini didattici la realizzazione di un "controllore ortografico" a mio piacere, ossia con le funzionalità che più mi piacciono.

Si tratta di inserire in input una stringa, valutare se è presente nel dizionario e stampare un eventuale messaggio di avvenuto/non avvenuto riscontro. Nel secondo caso si devono proporre anche i termini più simili.
#include "implementazioni.h"

void valutaTermine (string t)
{
    ifstream f ( "dizionario.txt", ios::in );

    if ( !f )
    {
        cout << "Errore nell'apertura del dizionario!\nControllare se è presente nel percorso del file.\n";
        exit (1);
    }

    bool trovato = false;
    string compare;

    /*    Ciclo per la prima verifica. La parola è presente nel dizionario?    */
    while ( !trovato && !f.eof() )
    {
        f >> compare;
        if ( compare == t )
        {
            cout << t << " e' presente nel dizionario.\n";
            trovato = true;
        }
    }

    /*    Se non ha riscontrato la parola, si preoccupa di trovarne una adatta    */
    if ( trovato == false )
    {
        cout << t << " non e' presente nel dizionario.\n";
        trovaAlternative(f,t);
    }

    f.close();
}

void trovaAlternative (ifstream &f, string t)
{
    int lunghezza = t.size();    //    Lunghezza della stringa immessa
    int sensibilita = lunghezza-3;    //    Variabile utile a stabilire quali sono le parole più affini
    int pos = 0;    //    È la posizione dell'array di risultati
    string cmp;
    string vet[20];

    f.seekg( 0 );

    do
    {
        //cout << "Entro.\n";
        int uguali = 0;        //    Vede quanti caratteri sono uguali nelle medesime posizioni

        f >> cmp;
        cout << cmp << '\n';
        int cmpSize = cmp.size();

        for ( int i = 0 ; i < lunghezza && i < cmpSize ; i++ )
        {
            if ( t[i] == cmp[i] )
            {
                uguali++;    //    Porta il conto

                if ( uguali == sensibilita )
                {
                    /*    È in tal caso che capisce che quella stringa può essere la nostra soluzione    */
                    vet[pos] = cmp;
                    pos++;
                }
            }
        }
    } while ( !f.eof() );

    cout << "Le possibili alternative sono " << pos << ":\n";
    for ( int i = 0 ; i < pos ; i++ )
    {
        cout << vet[i] << '\n';
    }
}
Queste sono le implementazioni.
Il problema nasce nel secondo ciclo, il while che si occupa di trovare i "suggerimenti". Sembra che non mi dia la possibilità di entrarvi (ovviamente col "do" mi dà la possibilità di entrarvi una volta) ma poi è come se il ifstream non trovi niente, ossia non scrive mai in cmp.
Quale può essere il problema?

4 Risposte

  • Re: Creazione "controllore ortografico"

    Cambia sta riga e riprova.
    
    f.seekg (0, ios::beg);
    
  • Re: Creazione "controllore ortografico"

    Poi chi ha detto che l'estrazione dia sempre esito positivo?
    
    f >> cmp;
    
    qui non stai controllando se la stringa è stata estratta, lo dai per scontato che lo sia. Io farei una cosa così:
    
    while(f >> cmp)
    {
    .......
    }
    
    almeno sai che se sei entrato nel while è perche sei riuscito ad estrarre il dato.
  • Re: Creazione "controllore ortografico"

    Nella funzione precedente finito sto ciclo
    
    while ( !trovato && !f.eof() )
        {
            f >> compare;
            if ( compare == t )
            {
                cout << t << " e' presente nel dizionario.\n";
                trovato = true;
            }
        }
    
    il file f può essere in stato error_bit eof. devi togliere lo stato dopo aver riavolto il file.
    f.clear();
  • Re: Creazione "controllore ortografico"

    Alla fine ho rivoluzionato completamente la scelta di progetto con una più semplice ed ho risolto.
    Grazie
Devi accedere o registrarti per scrivere nel forum
4 risposte