Fstrem con stringhe

di il
47 risposte

Fstrem con stringhe

Salve ! avrei bisogno di un aiuto per la gestione dei file, perchè anche se il mio programma compila correttamente, non mi apre nè modifica nessun file txt che ho creato ! Allora..
dopo aver incluso la libreria <fstream.h> uso queste istruzioni per leggere il file e mandarne a video il contenuto (non nel main ma in sottoprogrammi):

void input(int&n, vettore v){
int i;
fstream f;
f.open("Lista Pazienti.txt",ios::in);
for(i=0;i<n;i++){
while(!f.EOF()){
f>>v;
}
}
}

void stampa(int n, vettore v){
int i;
cout<<"La lista dei pazienti e':"<<endl;
for(i=0;i<n;i++){
cout<<v<<endl;
}
}

il file l'ho salvato sia nella cartella in cui è salvato anche il programma da me compilato, sia nella cartella in cui vi sono tutte le librerie ...dove sbaglio ? non succede proprio nulla ! XD

47 Risposte

  • Re: Fstrem con stringhe

    _alessiadele_ ha scritto:


    libreria <fstream.h>
    Quello è un file header e non una libreria (si includono gli header non le librerie).

    Inoltre dovrebbe essere <fstream> e non <fstream.h> (a meno che tu non usi vecchi ambienti di compilazione).

    In ogni caso, la prima cosa che devi aggiungere al codice è un controllo subito dopo la open per controllare che effettivamente il file sia stato trovato ed aperto.

    E soprattutto se usi sia la for che la while leggerai n volte tutto il file, cosa ovviamente sbagliata.

    Se sai che i dati da leggere sono n, allora usi solamente il for. Se non conosci il numero di elementi da leggere, allora usi il while con tutte le precauzioni per evitare di usare più elementi di quelli previsti nel vettore.
  • Re: Fstrem con stringhe

    Bene , inizia ad andare meglio! almeno adesso il programma si esegue, anche se non manda nulla a video, e anzi si blocca e si chiude l'esecuzione XD ma prima non faceva nemmeno quello !
    solo che non so come si mette il controllo ! non l'ho mai fatto !
  • Re: Fstrem con stringhe

    Mostra tutto il codice, compreso di main. E anche il contenuto tipo del file.
  • 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;
         fstream f;
         f.open("Lista Pazienti.txt",ios::in);
         while(!f.eof()){
                                          f>>v[i];
                                          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;
                          }
                          }
         
                                          
    int main(){
        int i,n;
        vettore v;
        fstream f;
        
        input(n,v);
        stampa(n,v);
        
        system("PAUSE");
        return 0;
    }
  • Re: Fstrem con stringhe

    Inserisci i caode tags. 5° pulsante con la scritta code. Ma possibile che nessuno legge il regolamento prima di porre quesiti?
  • Re: Fstrem con stringhe

    Scusa, ma non so come si usa..non sono pratica dei forum ! ora ci provo ...

    edit: fatto !
  • Re: Fstrem con stringhe

    OK Adesso possiamo leggere meglio il codice non trovi?
  • Re: Fstrem con stringhe

    Hai ragione, perdonami ! XD nella fretta di chiedere aiuto in vista dell'esame non ho pensato a leggere il regolamento ! errore mio !
  • Re: Fstrem con stringhe

    Nella funzione input

    1) i deve avere un valore iniziale e deve essere 0 quindi

    int i=0;

    2) alla fine della input deve essere valorizzata la variabile n, altrimenti a cosa serve passarla?

    n=i;
  • Re: Fstrem con stringhe

    Perfetto, ora funziona ! e un'ultima cosa ...per quanto riguarda la modifica del file ? nemmeno quella mi riesce ....
    #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;
         f.open("Lista Pazienti.txt",ios::out);
         int i;
         f>>n;
         for(i=0;i<n;i++){
                         if(strlen(v[i])<=5){
                                            strcpy(v[i],v[imax]);
                                            i=imax;
                                            i++;
                                            }
                                            f<<v[i]<<endl;
                                            }
                                            }
                                             
    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"<<endl<<s<<endl<<"e' presente"<<endl<<cont<<endl<<"volte nella lista dei pazienti!"<<endl;
        massimo(n,v,max,imax);
        cout<<"Il cognome piu' lungo e':"<<endl<<v[imax]<<endl;
        sostituzione(n,v,max,imax);
        stampa(n,v);
        
        system("PAUSE");
        return 0;
    }
        
         
    
  • Re: Fstrem con stringhe

    Cioè? Spiegati bene, non scrivere mezza frase da cui non si capisce il problema ...
  • Re: Fstrem con stringhe

    Mmmmm no veramente la mia frase non era scritta tanto per scrivere, il problema sta proprio nel fatto che il programma non modifica il file nel quale c'è la lista dei nomi ...quando lo riapro lo trovo sempre uguale, come all'inizio ! tutte le altre procedure però funzionano !
  • Re: Fstrem con stringhe

    Non metto in dubbio che ci sia il problema, ti chiedevo *maggiori spiegazioni* perché tu hai tutto chiaro sul tuo programma, chi legge dal forum no.

    Quindi

    1) che si fa quando si avvia il programma per replicare il problema ?

    2) quali funzioni sono coinvolte per la modifica del file ?

    3) cosa, secondo te, nel codice, non funziona (nello specifico, linee di programma all'interno di funzioni ...)

    4) hai fatto un po' di debugging, istruzione per istruzione, hai inserito dei punti di controllo per capire se tutto viene eseguito regolarmente ?

    Se le problematiche vengono descritte genericamente (non mi scrive i dati), non si mette nelle condizioni migliori chi ti vuole aiutare.

    Ad esempio ... perché usi quella funzione sostituisci ? A che servirebbe ? Perché in quella funzione, leggi da file il valore n (dato che il file è in scrittura, non mi sembra sensato) ? Perché confronti con una lunghezza >=5 ? Perché proprio 5 ? ...
  • Re: Fstrem con stringhe

    Bene, allora ..forse non riesco a spiegarmi XD
    Il programma deve leggere una lista di nomi dal file e mandarla a video (e questo funziona correttamente), deve vedere qual è il nome più lungo presente in lista, e mandarlo a video (e quest funziona correttamente); inoltre se inserisci da tastiera un altro nome, deve controllare se questo è già presente nella lista del file (e anche questo funziona correttamente).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 (io ed i miei amici abbiamo scelto a caso 5 caratteri giusto per vedere come ce la cavavamo con il confronto, le lunghezze ecc). Infine deve mandare la lista modificata a video (e la lista modificata me la manda tranquillamente a video). Io ho fatto ogni procedura una alla volta, e funzionano tutte tranne la modifica del file (che, come ho scritto prima, non viene modificato). Quindi l'errore sta proprio nella procedura "sostituzione", ma non so dove di preciso, in quanto ho controllato anche degli appunti che avevo, e non trovo niente di diverso. Ma questo è il primo programma che faccio con fstream, quindi sicuramente c'è qualcosa che mi sfugge o che non ho capito.
    Chiedo scusa se non sono chiara, sbaglio qualcosa o altro, ma è il mio primo esame di informatica, sono del tutto inesperta, quindi non so quali sono le cose importanti da specificare, sapere o quant'altro per rendere più chiara la situazione !
Devi accedere o registrarti per scrivere nel forum
47 risposte