Ricodifica di un testo

di il
12 risposte

Ricodifica di un testo

Buon giorno, devo risolvere questo esercizio ma da giorni non riesco a venirne a capo.
Un file (sorgente.txt) contiene un testo composto da un numero indefinito di righe, di lunghezza massima 200 caratteri ognuna. Un secondo file (dizionario.txt) contiene un elenco di coppie di stringhe. Il file dizionario.txt è organizzato come segue:
? sulla prima riga è presente un numero intero e positivo S (= 30), che indica il numero di possibili ricodifiche (sostituzioni) presenti nel dizionario
? seguono S coppie <compresso><originale> a rappresentare le sostituzioni possibili. Ogni sostituzione <compresso> è nella forma $<intero>$
Lo scopo del programma è di ricodificare il primo file di testo andando a sostituire sequenze di caratteri sulla base dei contenuti del secondo file. In caso di più sostituzioni possibili per una certa sottostringa, il programma scelga la prima sostituzione trovata. Il risultato della ricodifica sia salvato su un terzo file (ricodificato.txt).

Se qualcuno riuscisse a trovare l'errore e a spiegarmi dove sbaglio ve ne sarei grato.

Grazie in anticipo
int main()
{
    FILE* fdamodificare;
    fdamodificare = fopen("sorgente.txt","r");
    FILE* fdizionario;
    fdizionario = fopen("dizionario.txt","r");
    FILE* frisultante;
    frisultante = fopen("filerisultante.txt", "w");

    char paroladizionario2[30];
    char codificadizionario2[5];
    char parolasorgente[30];
    int i =0 , j = 0, k = 0;

    while(fscanf(fdizionario, "%s %s", codificadizionario2, paroladizionario2)==2)
    {
        while(fscanf(fdamodificare, "%s", parolasorgente)!=EOF)
        {
            if(paroladizionario2[i]==parolasorgente[j])
            {
                if(strlen(paroladizionario2)==(i+1))
                {
                    for(k = 0; k<strlen(codificadizionario2); k++)
                    {
                        fputc(codificadizionario2[k], frisultante);
                    }
                }
                else
                {
                    i++;
                    j++;
                }
            }
            else
            {
                fputc(parolasorgente[j], frisultante);
                j++;
            }
        }
    }

    fclose(fdamodificare);
    fclose(fdizionario);
    fclose(frisultante);

    return 0;
}

12 Risposte

  • Re: Ricodifica di un testo

    Di che errore parli? Dai maggiori dettagli
  • Re: Ricodifica di un testo

    Il contenuto del file sorgente.txt è:
    apelle figlio di apollo
    fece una palla di pelle di pollo
    tutti i pesci vennero a galla
    per vedere la palla di pelle di pollo
    fatta da apelle figlio di apollo

    Il contenuto del file dizionario.txt è:
    9
    $11$ pelle
    $2$ pollo
    $333$ palla
    $41$ alla
    $5078$ tta
    $6$ tti
    $7$ ll
    $81$ er
    $900$ ere

    Il file di uscita ricodificato.txt conterrà:
    a$11$ figlio di a$2$
    fece una $333$ di $11$ di $2$
    tu$6$ i pesci venn$81$o a g$41$
    p$81$ ved$900$ la $333$ di $11$ di $2$
    fa$5078$ da a$11$ figlio di a$2$

    Questo è invece ciò che ottengo compilando ed eseguendo:
    ai l o ÑsœÙµÎ€@ €@ @ À$
  • Re: Ricodifica di un testo

    I confronti tra stringhe non si fanno con == ma con la funzione strcmp

    E non dovresti usare la fputc per scrivere carattere per carattere ma la fprintf per scrivere una stringa
  • Re: Ricodifica di un testo

    Grazie per la risposta.
    Sapevo che strcmp serve per il confronto tra stringhe, ma io volevo fare un confronto per caratteri... ho provato a cambiare il fputc con fprintf ma ottengo sempre un output senza senso --> ai l o ÑsSo_€@ €@ @ À$
  • Re: Ricodifica di un testo

    magmanero ha scritto:


    Grazie per la risposta.
    Sapevo che strcmp serve per il confronto tra stringhe, ma io volevo fare un confronto per caratteri...
    E perchè mai vorresti farlo?
    ho provato a cambiare il fputc con fprintf ma ottengo sempre un output senza senso --> ai l o ÑsSo_€@ €@ @ À$
    hai usato %s ?
  • Re: Ricodifica di un testo

    Ciao, non ho usato strcmp perché io non voglio vedere se due parole sono uguali, ma se una certa sequenza di lettere è contenuta in una certa parola.
    Per la stampa, ho usato %c perché voglio stampare dei char, se provo a mettere %s non stampa nulla.
  • Re: Ricodifica di un testo

    Usa la strstr
  • Re: Ricodifica di un testo

    Hai ragione, non ci ho pensato. Grazie mille, domani provo e ti faccio sapere Buona serata!
  • Re: Ricodifica di un testo

    magmanero ha scritto:


    Hai ragione, non ci ho pensato. Grazie mille, domani provo e ti faccio sapere Buona serata!
    Ciao volevo sapere se hai risolto il problema perhè anch'io sto trovando difficoltà in un esercizio identico
  • Re: Ricodifica di un testo

    Ciao, sono sulla buona strada, mi ricodifica correttamente solo la prima parola presa dall'elenco di quelle da ricodificare (avrò sbagliato qualche cosa nell'acquisizione da file). Comunque si, con strstr è molto più veloce.
  • Re: Ricodifica di un testo

    magmanero ha scritto:


    Ciao, sono sulla buona strada, mi ricodifica correttamente solo la prima parola presa dall'elenco di quelle da ricodificare (avrò sbagliato qualche cosa nell'acquisizione da file). Comunque si, con strstr è molto più veloce.
    Ma per usare la strstr devo usare i puntatori?
  • Re: Ricodifica di un testo

    No, è una funzione che puoi usare se ad inizio codice scrivi sotto alle altre librerie #include <string.h>
    Se cerchi su internet ci sono esempi molto utili sull'utilizzo del strstr
Devi accedere o registrarti per scrivere nel forum
12 risposte