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

    [C] Trova-Sostituisci in file di testo!!!

    Salve!!! Il testo del mio compito dice:
    "Scrivere un programma ANSI C che acquisisce un file di testo e due stringhe e poi costruisce un nuovo file di testo ottenuto dal file di testo precedente sostituendo ogni occorrenza della prima stringa con la seconda stringa."
    Bene...il programma l'ho scritto, compila(seppur con un errore di warning! )...ma produce in output un file di testo vuoto!!!
    Qualcuno può dare un'occhiata a questo maledetto codice e farmi notare gli errori???
    GRAZIE!

    codice:
    #include <stdio.h>
    #include <string.h>
    #define FILE_MAX 10000
    #define STRING_MAX 256
    
    int carica(FILE *f, char *recTxt);
    
    int match(char *old_string, char *recTxt, int i);
    
    int len(char *old_string);
    
    /* Restituisce una stringa uguale a recTxt, ma in cui
       ogni occorrenza di str_in viene sostituita con str_out */
    char *replace(char *recTxt, char *old_string, char *new_string);
    
    /*prog.exe inputfile outputfile strsearch strreplace*/
    int main(int argc, char *argv[])
    {
      FILE *fileinput = '\0',
           *fileoutput = '\0';
      char recTxt[FILE_MAX];
    
     /*se la sintassi è sbagliata*/
     if(argc != 5)
     {  
       printf("\nSintassi: \nProgramma.exe inputfile.txt outputfile.txt searchstring replacestring\n");
       printf("Provare a rieseguire il programma con la corretta sintassi come descritta nella relazione.\n\n");   
     }
      /*se il file di input non viene aperto*/
      else if (!(fileinput = fopen(argv[1], "r"))) 
      {
        printf("Errore nell'apertura del file di input!\n");
        printf("Provare a rieseguire il programma con la corretta sintassi come descritta nella relazione.\n\n");
      }
       /*se il file di output non viene aperto*/
       else if (!(fileoutput = fopen(argv[2], "w"))) 
       {
         printf("Errore nell'apertura del file di output!\n");
         printf("Provare a rieseguire il programma con la corretta sintassi come descritta nella relazione.\n\n");
       }
         else	
         /* sostituisce ogni occorrenza di strSearch con strRepl */
         replace(recTxt, argv[3], argv[4]);
    
         /*chiusura dei due file*/
         fclose (fileinput);
         fclose (fileoutput);
         return 0;
    }
      int carica(FILE *f, char *recTxt)
      {
        int lun;
        lun = 0;
        fscanf(f,
               "%c",
    	   &recTxt[lun]);
        while(recTxt[lun] != EOF)
        {
         ++lun;
         fscanf(f,
                "%c",
                &recTxt[lun]);
        }
         recTxt[lun] = '\0';
         return(lun);
     }
    
      int match(char *old_string, char *recTxt, int i)
      {
       int j,
           k;
      
       j = 0;
       k = 1;
       while ((old_string[j] == recTxt[i+j]) && (old_string[j] != '\0'))
            ++j;
        if (old_string[j] != '\0')
           k = 0;  
       return(k);
      }
     
       int len(char *old_string)
       {
        char *p;
        p = old_string;
        while (*old_string != '\0' ) 
        { 
         ++old_string;    
        }
        return(old_string - p);
      }
    
       char *replace(char *recTxt, char *old_string, char *new_string)
       {
        int i,
            j,
            k,
            L;
        char new_txt[FILE_MAX];
    
        i = 0;
        j = 0;
        L = len(old_string);
    
        while (recTxt[i] != '\0')
        { 
         if (match(old_string, recTxt, i) == 1)
    
         {
           k = 0;
           while (new_string[k] != '\0')
           {
             new_txt[j] = new_string[k];
             ++j;
             ++k;
           }
             
              i = i + L;	  /* e mi sposto in recTxt subito dopo old_string */
    
         }
           else   /* Altrimenti, copio un altro carattere di recTxt su new_txt */
       
           {
             new_txt[j] = recTxt[i];
             ++i;
             ++j;
           }
        }
    
           new_txt[j] = '\0';          /* Alla fine */
           return(new_txt);	    /* inserisco il carattere '\0' di fine stringa */
    
       }

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    Spiegami una cosa:
    la funzione replace() ritorna una stringa che tu non usi (la richiami senza salvare il valore di ritorno)... tanto vale dichiararla void...

    Poi: il primo parametro che gli passi è una stringa vuota, o meglio un array di caratteri non inizializzato... la prima cosa che fa la funzione è fermarsi appena trova il carattere null (quindi subito, se ti va bene...).

    Io rivedrei un attimino queste due cose, prima di andare avanti a leggere il programma...


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  3. #3
    Beh...la funzione replace dovrebbe restituire il testo precedentemente caricato con la stringa sostituita...e il testo dovrebbe essere stato caricato sulla variabile recTxt...dovrebbe!!!!Come mai recTxt non ha caricato il testo di input???(sono alle prime armi...quindi magari saranno errori banali per voi cervelloni!!! )

  4. #4
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    Originariamente inviato da red_devil87
    Beh...la funzione replace dovrebbe restituire il testo precedentemente caricato con la stringa sostituita...
    E allora perchè la richiami senza salvare il valore di ritorno da nessuna parte?
    Questo è il tuo codice che richiama la funzione (metodo main):
    codice:
    replace(recTxt, argv[3], argv[4]);
    Se una funzione restituisce qualcosa, di solito questo qualcosa va assegnato ad una variabile o passato ad un'altra funzione... ad esempio, se la funzione "pippo" ritorna un intero la uso in questo modo:
    codice:
    variabileIntera = pippo();
    e il testo dovrebbe essere stato caricato sulla variabile recTxt...dovrebbe!!!!Come mai recTxt non ha caricato il testo di input???
    Ti aspetti forse che il computer la carichi di sua iniziativa? Nel metodo main() (che è il primo ad essere invocato) tu hai dichiarato recTxt ma non l'hai mai inizializzata da nessuna parte prima di passarla alla funzione...


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  5. #5
    E allora perchè la richiami senza salvare il valore di ritorno da nessuna parte?
    Questo è il tuo codice che richiama la funzione (metodo main):
    codice:

    replace(recTxt, argv[3], argv[4]);


    Se una funzione restituisce qualcosa, di solito questo qualcosa va assegnato ad una variabile o passato ad un'altra funzione... ad esempio, se la funzione "pippo" ritorna un intero la uso in questo modo:
    codice:

    variabileIntera = pippo();
    dovrei fare così???
    codice:
    variabile = replace(recTxt, argv[3], argv[4]);
    Tutto questo va fatto nella main???e come devo dichiararla tale variabile?

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,481
    Originariamente inviato da red_devil87
    dovrei fare così???
    codice:
    variabile = replace(recTxt, argv[3], argv[4]);
    Tutto questo va fatto nella main???e come devo dichiararla tale variabile?
    Ma questo

    /* Restituisce una stringa uguale a recTxt, ma in cui
    ogni occorrenza di str_in viene sostituita con str_out */
    char *replace(char *recTxt, char *old_string, char *new_string);

    lo hai scritto tu?

    Quindi ...

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 © 2026 vBulletin Solutions, Inc. All rights reserved.