Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 15
  1. #1
    Utente di HTML.it
    Registrato dal
    Nov 2012
    Messaggi
    10

    C++ leggere da file stringa con spazi

    Salve a tutti ragazzi.
    Sto scrivendo un programma in C++ e da un po' di ore sto impazzendo con questa cosa:
    ho creato una classe che dovrebbe contenere parecchi oggetti, inizialmente li avevo inseriti in un array inizializzandoli uno per uno con i rispettivi dati, ma poi ho pensato di mettere i dati su un file txt, leggerli e assegnarli alle varie istanze.
    Bene, finchè si è trattato di leggere dal file valori numerici è andato tutto liscio (ho usato >>), ma quando si è trattato di leggere stringhe con spazi sono iniziati i problemi, ovviamente, dato che l'operatore >> si ferma quando incontra lo spazio.
    Qui sotto posto una versione semplificata del mio codice, giusto per farvi capire la situazione. Ho fatto un array di 3 oggetti ma normalmente volevo metterne di più.
    Come posso ovviare al problema e riuscire a leggere da file tutta la stringa compresi gli spazi?
    Esiste un modo? O devo rinunciare e tornare a inizializzare gli oggetti con un costruttore?
    Cosa mi consigliate di fare? Considerate che sono alle prime armi...Grazie in anticipo

    codice:
    #include <iostream>
    #include <fstream>
    using namespace std; ifstream file;
    class Prova{ int a,b; public: char nome[20]; 
    void mostra() { cout << a << b <<nome;} 
    void set() { file>>a>>b>>nome; } }; 
    
    int main() { file.open("prova.txt", ios::in);
    Prova oggetto[3]; 
    for(int i=0;i<3;i++) 
    oggetto[i].set(); 
    for(int j=0;j<3;j++) 
    oggetto[j].mostra(); 
    file.close(); 
    cout<<"Fine"; return 0; }

  2. #2
    Utente bannato
    Registrato dal
    Apr 2012
    Messaggi
    510
    Usa la getline.

  3. #3
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  4. #4
    Utente di HTML.it
    Registrato dal
    Nov 2012
    Messaggi
    10
    Ci ho provato, e all'esecuzione il programma mi viene fuori una cosa disastrosa:

    codice:
    12-858993460-858993460-858993460-858993460FinePress any key to continue
    la cosa strana è che i primi due valori numerici (1 e 2) li legge, poi più nulla
    ma forse è la sintassi che uso a non andar bene...dove sbaglio?
    codice:
    class Prova{ int a,b; 
    public: 
    string nome; 
    void mostra() { cout << a << b <<nome;} 
    void set() { file>>a>>b;
    getline(file,nome);
    
    } };

  5. #5
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Ma tu leggi in str e poi cosa visualizzi?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  6. #6
    Utente di HTML.it
    Registrato dal
    Nov 2012
    Messaggi
    10
    Ecco, infatti non mi ero reso conto dell'errore, in mostra() avevo ancora "nome"
    ora l'ho corretto, ma l'output non è dei migliori (ho modificato il post ma mi hai bruciato sul tempo )

  7. #7
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Ma hai anche questo

    char nome[20]

    nel codice?

    Puoi mostrare *tutto* il codice modificato e anche il contenuto di questo file di cui parli?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  8. #8
    Utente di HTML.it
    Registrato dal
    Nov 2012
    Messaggi
    10
    codice:
    #include <iostream> 
    #include <fstream> 
    #include <string> 
    using namespace std; ifstream file; 
    class Prova{ int a,b; 
    public: string nome; 
    void mostra() { cout << a << b <<nome;} 
    void set() { 
    file>>a>>b; 
    getline(file,nome); 
    } 
    };
    int main() { 
    file.open("prova.txt", ios::in); 
    Prova oggetto[3]; 
    for(int i=0;i<3;i++) 
    oggetto[i].set(); 
    for(int j=0;j<3;j++) 
    oggetto[j].mostra(); 
    file.close(); 
    cout<<"Fine"; return 0; }
    il contenuto del file è semplicemente questo
    codice:
    1
    2
    Prima prova
    3
    4
    Seconda prova
    5
    6
    Terza prova
    Naturalmente il codice è estremamente semplice così come il contenuto del file. Sto cercando di far funzionare il tutto "in piccolo" in modo poi da applicare il meccanismo a qualcosa di più complesso.
    Comunque ho notato una cosa: nel mio compilatore (Microsoft Visual C++ 6.0) tutti i tipi di dato mi vengono segnati in azzurro, ma string no...è normale?

  9. #9
    Utente di HTML.it
    Registrato dal
    Nov 2012
    Messaggi
    10
    Ho notato per ora che creando un file composto solo da stringhe (con spazi) e quindi eliminando nelle due funzioni ogni riferimento ai dati numerici a e b, il problema sembra risolversi. Perchè se ci sono stringhe e numeri succede il finimondo?
    Devo per forza creare due file, uno con i numeri e uno con le stringhe?

  10. #10
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    No ... il problema deriva dal "ritorno a capo" visto che i dati non stanno su singole linee.

    Prova ad inserire due volte la getline, ovvero

    getline(file, nome);
    getline(file, nome);
    No MP tecnici (non rispondo nemmeno!), usa il forum.

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