[C++]Creare stringa formattata

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
Feniz
Prode Principiante
Messaggi: 2
Iscrizione: giovedì 12 giugno 2014, 12:02

[C++]Creare stringa formattata

Messaggio da Feniz »

Buongiorno a tutti :ciao: .

Mi trovo nella seguente situazione:

ho una cout del tipo: cout<<setw(10)<<giocatore.id()<<setw(10)<<giocatore.nome()<<setw(10)<<giocatore.forza()<<giocatore.valore();

Vorrei inserire in una stringa (ad esempio str) le variabili che stampo nella cout, mantenendo la formattazione.


N.B: giocatore.id() ecc... ritornano il valore del dato id ecc dell'oggetto giocatore.

Come potrei fare?
1001001
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1506
Iscrizione: mercoledì 22 dicembre 2010, 18:09
Desktop: Unity
Distribuzione: Ubuntu 14.04.1 LTS 64bit
Località: Verona

Re: [C++]Creare stringa formattata

Messaggio da 1001001 »

Ciao!
Devi usare uno stringstream: http://www.cplusplus.com/reference/sstr ... ingstream/

Se non è chiaro/se ci sono problemi chiedi pure tutto :)
"I find your lack of faith disturbing."
Feniz
Prode Principiante
Messaggi: 2
Iscrizione: giovedì 12 giugno 2014, 12:02

Re: [C++]Creare stringa formattata

Messaggio da Feniz »

Ho letto e cercato di capire e buttato giù del codice, che funziona....quasi :lol:

Praticamente voglio inserire in str quello che stampo a video nelle cout, a sua volta passerò str alla funzione writeFile che la scriverà scriverà su un file.
Purtroppo mi scrive sul file roba cosi:

La squadra x ha schierato:

La suadra x ha schierato:
ID NOME VALORE FORZA DENARO ABILITA'


La suadra x ha schierato:
ID NOME VALORE FORZA DENARO ABILITA'
-------------------------------------------------------------

La suadra x ha schierato:
ID NOME VALORE FORZA DENARO ABILITA'
-------------------------------------------------------------
1 ff 2 3 4 4


La suadra x ha schierato:
ID NOME VALORE FORZA DENARO ABILITA'
-------------------------------------------------------------
1 ff 2 3 4 4
4 fefe 3 3 5 2

anzichè scivermelo in una sola volta.
Ho usato bene la stringstream?

Codice: Seleziona tutto

stringstream fmp;
    string str;
    cout<<"\n\nLa squadra "<<giocatore->getNome()<<" ha schierato:\n\n";
    fmp<<"\n\nLa squadra "<<giocatore->getNome()<<" ha schierato:\n\n";
    str=fmp.str();
    file->writeFile(str);
    cout<<setw(10)<<"ID"<<setw(17)<<"NOME CARTA"<<setw(10)<<"FORZA"<<setw(10)<<"DENARO"<<"ABILITA'\n";
    fmp.clear();
    fmp<<setw(10)<<"ID"<<setw(17)<<"NOME CARTA"<<setw(10)<<"FORZA"<<setw(10)<<"DENARO"<<"ABILITA'\n";
    str.clear();
    str=fmp.str();
    file->writeFile(str);
    cout<<"------------------------------------------------------\n\n";
    fmp.clear();
    fmp<<"------------------------------------------------------\n\n";
    str.clear();
    str=fmp.str();
    file->writeFile(str);

    for(i=0; i<giocatore->getNSchierate(); i++){

        cout<<setw(10)<<(temp1+i)->getId()<<setw(17)<<(temp1+i)->getNome()<<setw(10)<<(temp1+i)->getForza()<<setw(10)<<(temp1+i)->getDenaro()<<(temp1+i)->getAbilita()<<endl;
        fmp.clear();
        fmp<<setw(10)<<(temp1+i)->getId()<<setw(17)<<(temp1+i)->getNome()<<setw(10)<<(temp1+i)->getForza()<<setw(10)<<(temp1+i)->getDenaro()<<(temp1+i)-           >getAbilita()<<endl;
        str.clear();
        str=fmp.str();
        file->writeFile(str);
    }
    cout<<"\n------------------------------------------------------\n";
    fmp.clear();
    fmp<<"\n------------------------------------------------------\n";
    str.clear();
    str=fmp.str();
    file->writeFile(str);

1001001
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1506
Iscrizione: mercoledì 22 dicembre 2010, 18:09
Desktop: Unity
Distribuzione: Ubuntu 14.04.1 LTS 64bit
Località: Verona

Re: [C++]Creare stringa formattata

Messaggio da 1001001 »

Il problema è che il metodo clear di stringstream non fa quello che tu credi che faccia..il nome può essere fuorviante, lo ammetto :)
Il metodo clear fa questo:
Sets a new value for the stream's internal error state flags.
(http://www.cplusplus.com/reference/ios/ios/clear/)

Per svuotare una variabile di tipo stringstream devi chiamare il metodo str (che se chiamato senza argomenti restituisce il contenuto dello stream in una stringa ma se chiamato su una stringa setta il contenuto dello stream usando la stringa in input) passandogli come input una stringa vuota. Faccio un esempio che se no non si capisce niente:

Codice: Seleziona tutto

#include <iostream>
#include <string>
#include <sstream>

int main ()
{
    std::string str;
    std::ostringstream stream;
    
    stream << "foo";
    str = stream.str ();
    std::cout << str << std::endl;
    
    stream.str (std::string ());
    stream << "bar";
    str = stream.str ();
    std::cout << str << std::endl;
    return 0;
}
Nota che ho usato ostringstream invece di stringstream in modo che siano garantite solo operazioni di stampa sullo stream e non di lettura da stream (il compilatore darebbe errore), cosa che garantisce un ulteriore controllo di correttezza del codice.

PS:
Feniz ha scritto:Praticamente voglio inserire in str quello che stampo a video nelle cout, a sua volta passerò str alla funzione writeFile che la scriverà scriverà su un file.
perché mai? Non puoi scrivere su file direttamente? :)
"I find your lack of faith disturbing."
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 7 ospiti