Visualizzazione dei risultati da 1 a 6 su 6
  1. #1

    [C] Non trovo l'errore nel codice

    Ciao a tutti
    Ho scritto questo programma in C che deve stampare una lista di tutte le parole chiave (che trova nel file che gli passo come secondo parametro) che trova nel testo (che è il file che gli passo come primo parametro) sul file che gli passo come terzo parametro con il numero delle righe in cui compaiono.
    Non mi da nessun errore di compilazione e neanche di esecuzione però non produce il risultato desiderato, perchè? Non riesco a trovare l'errore.

    Questo è il codice del programma:

    codice:
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    //Funzione per gestire gli errori
    void printerror(char *str, int n) 
    {
     fprintf(stderr, "Errore %d: %s\n", n, str);
     exit(n);
    }
    
    //Funzione che trova la parola che gli passo in fileIn e scrive in fileOut
    void trovaParola(char *parola, FILE *fileOut, FILE *fileIn)
    {
     char t[100];
     char *riga;
     int priga; //priga è il contatore delle righe
     char *p;
     riga = fgets(t, 100, fileIn); // leggo la prima riga del file
    
      //Scrivo la parola chiave nel file di output 
       if(fputs(parola, fileOut) == EOF){ 
         printerror("Errore nella scrittura della parola nel secondo file.", 3);
       }
    
       priga=1;
       while (riga != NULL){ //fino alla fine del testo
         p = strstr(riga, parola); //guardo se la parola chiave è presente nella riga
         if (p != NULL){ // p=NULL se non ha trovato la parola nella riga
           if(fprintf(fileOut, "%d\n", priga) == EOF){ //scrivo il numero della riga nel file di output
             printerror("Errore nella scrittura della riga nel secondo file.", 3);
           }
         }
         riga = fgets(t, 100, fileIn); //vado alla riga successiva
         priga++; //incremento il contatore
       }
    }
    
    //Funzione che conta le righe in fileIn e cioè le parole chiave
    int contaRighe(FILE *fileIn)
    {
     int righe=0, i;
     i = fgetc(fileIn);
     while (i != EOF){
       if (i == '\n'){ 
         righe++;
       }
       i = fgetc(fileIn);
     }
     return righe;
    }
    
    
    int main(int argc, char *argv[])
    {
     FILE *fin_t;
     FILE *fin_p;
     FILE *fout;
    
     char p[20];
     char *parola;
     int r, i;
    
     int chiudit, chiudip, chiudio;
    
     if (argc != 4){
      printerror("Specificare tre file come argomenti.\n", 1);
     }
    
     fin_t = fopen(argv[1],"r");
     if (fin_t == NULL){
      printerror("Errore nell’apertura del primo file.\n", 2);
     }
    
     fin_p = fopen(argv[2],"r");
     if (fin_p == NULL){
      printerror("Errore nell’apertura del secondo file.\n", 2);
     }
    
     fout = fopen(argv[3],"w");
     if (fout == NULL){
      printerror("Errore nell’apertura del terzo file.\n", 2);
     }
    
     r = contaRighe(fin_p); //guardo quante parole chiave ho
    
     rewind(fin_p); //rimetto il puntatore all'inizio del file
    
     parola = fgets(p, 20, fin_p);
    
     for(i=0; i<r; i++){ //per quante volte sono le parole chiave
       trovaParola(parola, fout, fin_t); //eseguo la funzione trovaParola()
       parola = fgets(p, 20, fin_p); //vado alla parola successiva
       rewind(fin_t); //rimetto il puntatore all'inizio del file in modo da passarlo tutto ogni volta
     }
    
     chiudit = fclose(fin_t);
     if(chiudit == 0){
       printf("Chiusura del primo file corretta.\n");
     }else{
       printf("Errore nella chiusura del primo file.\n");
       return ;
     } 
    
     chiudip = fclose(fin_p);
     if(chiudip == 0){
       printf("Chiusura del primo file corretta.\n");
     }else{
       printf("Errore nella chiusura del primo file.\n");
       return ;
     }  
    
     chiudio = fclose(fout);
     if(chiudio == 0){
       printf("Chiusura del secondo file corretta.\n");
     }else{
       printf("Errore nella chiusura del secondo file.\n");
       return ;
     }
    }
    Esempi dei file che passo come parametri:
    -parole_chiave.txt

    testo
    programma
    parole
    file

    -testo.txt

    Questo è il testo dove il programma
    deve cercare le parole chiave
    che sono scritte nel file
    e scrivere il risultato nel file ris.txt

    -il risultato corretto che deve scrivere nel file ris.txt è:

    testo
    1
    programma
    1
    parole
    2
    file
    3
    4


    grazie mille e tutti!

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Quando leggi con la fgets devi considerare che viene aggiunto un caratter 0x0A alla fine della stringa letta. Quindi, quando confronti la parola letta, non verrà mai trovata nel testo a meno che non sia alla fine.

    Per rimediare devi togliere questo carattere dalla fine della stringa (subito dopo ogni fgets) in questo modo

    if(parola && parola[strlen(parola)-1]==10) parola[strlen(parola)-1]=0;
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Non ho capito perchè ==10

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Originariamente inviato da ChiaraB92
    Non ho capito perchè ==10
    Come ti ho scritto prima

    viene aggiunto un carattere 0x0A ...


    P.S. Vedo comunque che ti hanno già chiarito in

    http://www.pierotofy.it/pages/extras...trovo_lerrore/

    Tieni presente che la sostituzione come ti è stata proposta senza alcun controllo, può fare andare in errore il programma ... usa la if come ti ho suggerito ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    (tra parentesi, giusto per portabilità e per maggiore leggibilità invece di fare il confronto con 10 o 0xA metterei '\n' - così è immediatamente chiaro che vuoi rimuovere il newline finale)
    Amaro C++, il gusto pieno dell'undefined behavior.

  6. #6
    Va bene, grazie mille!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.