Fstrem con stringhe

di Anonimizzato11938 il
47 risposte

47 Risposte - Pagina 2

  • _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.
  • 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 !
  • 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?
  •    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;
    }
  • 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.
  • Fatto...ancora non va ! il programma non modifica il file ...tutto come prima !
  • Devi anche aggiungere la chiusura del file alla fine della funzione

    f.close();
  • Ora l'ho aggiunta ! ...e ancora non va !
    non so, è come se mi sfuggisse qualcosa !
  • Facci vedere tutto il codice attuale modificato.
  • 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;
    }
  • Ma chi ti ha detto di inserire la open nel ciclo ?
  • 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 ! :\
  • No ... se non rispondi chiaramente mostrando l'effettivo codice, scusa ma è tutta una perdita di tempo.
  • 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;
    }
        
  • 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