Fstrem con stringhe

di il
47 risposte

47 Risposte - Pagina 2

  • Re: Fstrem con stringhe

    _alessiadele_ ha scritto:


    ... Poi deve modificare la lista nel file, vedendo se uno dei nomi presenti in lista ha 5 caratteri o meno, e in questo caso deve sostituirlo con il nome più lungo, che ha calcolato nella precedente procedura.
    Ok, quindi la funzione da controllare è la

    sostituisci

    Prova a descrivere quello che fai in quella funzione, linea per linea.
  • Re: Fstrem con stringhe

    Okok ! Allora ...

    dichiaro fstream;
    apro il file per modificarlo;
    dichiaro i;
    con il for "scorro" tutte le stringhe presenti nella matrice;
    con l'if controllo se la lunghezza di una generica stringa dovesse essere minore o uguale a 5 caratteri, in questo caso sostituisco questa stringa con il nome più lungo presente nella lista;
    infine scrivo sul file il nuovo elenco di nomi (ho usato f<<v perchè v dovrebbe essere l'array modificato, giusto? )
    questo è quanto

    poi nell'int main ho soltanto chiamato la procedura ed usato il cout per mostrare a video la lista modificata, e la stampa correttamente !
  • Re: Fstrem con stringhe

    Scusa ma discutiamo con il codice

    Qui il file non si apre per la "modifica" ma apri il file per la scrittura. In questo caso il file viene cancellato e riscritto da zero.
    
    fstream f;
    f.open("Lista Pazienti.txt",ios::out);
    
    Hai visto che c'è questa linea? A che serve?
    
         f>>n;
    [/quote]
    
    Metto meglio la for per capire i blocchi
    
    [code]
    for(i=0;i<n;i++)
    {
       if(strlen(v[i])<=5)
       {
          strcpy(v[i],v[imax]);
          i=imax;
          i++;
       }
       
       f<<v[i]<<endl;
    }
    
    ma

    i=imax;
    i++;

    a cosa servono?
  • Re: Fstrem con stringhe

       f>>n;       questo l'ho tolto, perchè in effetti conosciamo già il contenuto del file ..è inutile !
    
    
    
    for(i=0;i<n;i++)
    {
       if(strlen(v[i])<=5)
       {
          strcpy(v[i],v[imax]);
          i=imax;          // l'ho messo per sostituire la generica posizione i con la posizione del massimo ! è inutile ?
          i++;    // mi son resa conto dopo che è inutile, dato che stiamo usando il for ..quindi l'ho tolto !
       }
       
       f<<v[i]<<endl;
    }
  • Re: Fstrem con stringhe

    f>>n; questo l'ho tolto, perchè in effetti conosciamo già il contenuto del file ..è inutile !
    Direi proprio ... anche perché lo stai leggendo da un file aperto in output ...
    i=imax; // l'ho messo per sostituire la generica posizione i con la posizione del massimo ! è inutile ?
    E perchè mai devi cambiare il valore di i? E' la for che modifica i ... Non sono è inutile, ma dannoso, dato quello che devi fare ...
    i++; // mi son resa conto dopo che è inutile, dato che stiamo usando il for ..quindi l'ho tolto !
    Dopo aver tolto tutto ... esegui nuovamente il programma con dati corretti.
  • Re: Fstrem con stringhe

    Fatto...ancora non va ! il programma non modifica il file ...tutto come prima !
  • Re: Fstrem con stringhe

    Devi anche aggiungere la chiusura del file alla fine della funzione

    f.close();
  • Re: Fstrem con stringhe

    Ora l'ho aggiunta ! ...e ancora non va !
    non so, è come se mi sfuggisse qualcosa !
  • Re: Fstrem con stringhe

    Facci vedere tutto il codice attuale modificato.
  • Re: Fstrem con stringhe

    Certo !
    #include<iostream>
    #include<cstdlib>
    #include<string.h>
    #include<fstream>
    #define N 100
    
    typedef char stringa[N];
    typedef stringa vettore[N];
    using namespace std;
    
    void input(int&n, vettore v){
         int i=0;
         fstream f;
         f.open("Lista Pazienti.txt",ios::in);
         while(!f.eof()){
                                          f>>v[i];
                                          i++;
                                          n=i;
                                          }
                                          }
                                          
                                          
    void stampa(int n, vettore v){
         int i;
         cout<<"La lista dei pazienti e':"<<endl;
         for(i=0;i<n;i++){
                          cout<<v[i]<<endl;
                          }
                          }
                          
    void ripetizione(int n, vettore v, int&cont, stringa s){
         int i;
         cont=0;
         cout<<"Inserisci il cognome che vuoi cercare:"<<endl;
         cin>>s;
         for(i=0;i<n;i++){
                          int esito=strcmp(v[i],s);
                          if(esito==0){
                                       cont++;
                                       }
                                       }}
                                       
    void massimo(int n, vettore v, int&max, int&imax){
         int i;
         max=strlen(v[0]);
         imax=0;
         for(i=0;i<n;i++){
                          if(strlen(v[i])>max){
                                               max=strlen(v[i]);
                                               imax=i;
                                               }
                                               }}
                                               
    void sostituzione(int n, vettore v, int max, int imax){
         fstream f;
         int i;
         for(i=0;i<n;i++){
                         if(strlen(v[i])<=5){
                                            strcpy(v[i],v[imax]);
                                            }
                                            f.open("Lista Pazienti.txt",ios::out);
                                            f<<v[i]<<endl;
                                            f.close();
                                            }
                                            }
                                               
    int main(){
        int i,n;
        vettore v;
        stringa s;
        fstream f;
        int cont=0;
        int max,imax;
        
        input(n,v);
        stampa(n,v);
        ripetizione(n,v,cont,s);
        cout<<"Il cognome"<<" "<<s<<" "<<"e' presente"<<" "<<cont<<" "<<"volte nella lista dei pazienti!"<<endl;
        massimo(n,v,max,imax);
        cout<<endl<<"Il cognome piu' lungo e':"<<endl<<v[imax]<<endl;
        sostituzione(n,v,max,imax);
        cout<<"La lista in seguito alle ultime modifiche e':"<<endl;
        for(i=0;i<n;i++){
                         cout<<v[i]<<endl;
                         }
        
        system("PAUSE");
        return 0;
    }
  • Re: Fstrem con stringhe

    Ma chi ti ha detto di inserire la open nel ciclo ?
  • Re: Fstrem con stringhe

    No ho sbagliato ad incollare ...volevo incollare solo "f<<..." ed invece ho incollato tutto !...mi sono imbrogliata un attimo !
    ad ogni modo ..anche togliendolo il programma cmq non va ! :\
  • Re: Fstrem con stringhe

    No ... se non rispondi chiaramente mostrando l'effettivo codice, scusa ma è tutta una perdita di tempo.
  • Re: Fstrem con stringhe

    Ecco com'è ora:
    #include<iostream>
    #include<cstdlib>
    #include<string.h>
    #include<fstream>
    #define N 100
    
    typedef char stringa[N];
    typedef stringa vettore[N];
    using namespace std;
    
    void input(int&n, vettore v);
    void stampa(int n, vettore v);
    void massimo(int n, vettore v, int&max, int&imax);
    void sostituzione(int n, vettore v, int max, int imax);
    
    void input(int&n, vettore v){
         int i=0;
         fstream f;
         f.open("Lista Pazienti.txt",ios::in);
         while(!f.eof()){
                                          f>>v[i];
                                          i++;
                                          n=i;
                                          }
                                          }
                                          
                                          
    void stampa(int n, vettore v){
         int i;
         cout<<"La lista dei pazienti e':"<<endl;
         for(i=0;i<n;i++){
                          cout<<v[i]<<endl;
                          }
                          }
                          
    void ripetizione(int n, vettore v, int&cont, stringa s){
         int i;
         cont=0;
         cout<<"Inserisci il cognome che vuoi cercare:"<<endl;
         cin>>s;
         for(i=0;i<n;i++){
                          int esito=strcmp(v[i],s);
                          if(esito==0){
                                       cont++;
                                       }
                                       }}
                                       
    void massimo(int n, vettore v, int&max, int&imax){
         int i;
         max=strlen(v[0]);
         imax=0;
         for(i=0;i<n;i++){
                          if(strlen(v[i])>max){
                                               max=strlen(v[i]);
                                               imax=i;
                                               }
                                               }}
                                               
    void sostituzione(int n, vettore v, int max, int imax){
         fstream f;
         int i;
         for(i=0;i<n;i++){
                         if(strlen(v[i])<=5){
                                            strcpy(v[i],v[imax]);
                                            }
                                            f<<v[i]<<endl;
                                            f.close();
                                            }
                                            }
                                               
    int main(){
        int i,n;
        vettore v;
        stringa s;
        fstream f;
        int cont=0;
        int max,imax;
        
        input(n,v);
        stampa(n,v);
        ripetizione(n,v,cont,s);
        cout<<"Il cognome"<<" "<<s<<" "<<"e' presente"<<" "<<cont<<" "<<"volte nella lista dei pazienti!"<<endl;
        massimo(n,v,max,imax);
        cout<<endl<<"Il cognome piu' lungo e':"<<endl<<v[imax]<<endl;
        sostituzione(n,v,max,imax);
        cout<<"La lista in seguito alle ultime modifiche e':"<<endl;
        for(i=0;i<n;i++){
                         cout<<v[i]<<endl;
                         }
        
        system("PAUSE");
        return 0;
    }
        
  • Re: Fstrem con stringhe

    Anche la close va fuori dal ciclo, alla fine della funzione!

    Apri all'inizio

    Ciclo per scrivere

    Chiudi
Devi accedere o registrarti per scrivere nel forum
47 risposte