Getline non prende gli input correttamente

di il
1 risposte

Getline non prende gli input correttamente

Salve ragazzi!
Stavo provando un po' di programmazione server e client + multithreading (tutto con le SFML), quando mi sono inbattuto in un errore strano...
Dato che i thread con le SFML puntano ad una funzione e si puo' condividere una variabile con essi solo al momento della sua creazione, ho optato per creare una variabile globale (inputstring) e l'ho usata nella funzione readInput, che verra' aperta in un thread e continuera' per sempre.
Dato che dovra' leggere intere frasi, ho usato getline, ma non riesce a leggere la stringa!
Funzione:
void readInput()
{
    while()
    {
    	getline(cin, inputString); //Ho provato a mettere anche il carattere di delimitazione '\0' :\
    }
}
Riesco a farlo funzionare solo con un cout sotto di qualche carattere non vuoto (es. non vale il '\0'), per comodita' ho usato lo spazio, ma e' comunque fastidioso, quindi vorrei risolvere il rpoblema in un modo diverso.
Esempio:

void readInput()
{
    while()
    {
    	getline(cin, inputString);
    	cout <<" "; //o (quasi) qualunque altro carattere
    }
}

Ho provato con fflush sia di stdin che di stdout, con cin.clear() prima e con cin.ignore() stessa cosa.
Non credo che il resto del codice possa essere in qualche modo utile, metto soltanto la parte dove utilizzo il prodotto del thread...

//Globale
string inputString;

//nel main
Thread getInput(&readInput); //creo il tread getInput e lo collego alla funzione readInput


//l'istruzione prima del main while
    getInput.launch();
//nel main while
if (!inputString.empty())
            fragmentString(inputString, " ", command);
        if (command[0] == "help")
        {
            cout <<"List of commands: \nPing <id>: return the ping of a client." <<endl;
            command[0].clear();
            command[1].clear();
            command[2].clear();
            command[3].clear();
            command[4].clear();
        }
        if (command[0] == "ping")
        {
            if (!command[1].empty() && isNumber(command[1]))
            {
                if (atoi(command[1].c_str()) >= 500 or atoi(command[1].c_str()) < 0)
                    {
                        cout <<"Client not found. "<< endl;
                    }
                    else if(client[atoi(command[1].c_str())].status == "Connected" or client[atoi(command[1].c_str())].status == "Not Ready")
                    {
                        cout <<"Ping of client " <<command[1] <<"(" <<client[atoi(command[1].c_str())].packet.getRemoteAddress() <<"): " <<client[atoi(command[1].c_str())].ping <<endl;
                    }
                    else {
                            cout <<"Client not found. "<< endl;
                    }

            }
            else
            {
                cout <<"Error: Insert a valid ID." <<endl;
            }
            command[0].clear();
            command[1].clear();
            command[2].clear();
            command[3].clear();
            command[4].clear();

        }

fragmentString e' una funzione creata da me che uso per frammentare una stringa in un vettore di stringhe seguendo un separatore.
void fragmentString(string data, string separator, string fragmented_string[]); //Stringa in input, separatore (anche piu' caratteri) e la stringa frammentata in output.


P.s. e' solo un prototipo di codice, pls non mangiatemi per quello che state osservando
Se comunque pensate qualche consiglio da darmi per scrivere del codice migliore quando lo rifiniro', sara' ben accettato
E si', client[] e' una classe e non ha metodi, solo attributi pubblici. Questa sara' una delle prime cose che rifiniro'. Ripensandoci, per il prototipo un record sarebbe stato piu' carino.

1 Risposte

  • Re: Getline non prende gli input correttamente

    Credo di aver capito gli errori: prende il carattere "invio" come un'andata a capo e aggiunge un \n. Se modifico il codice e scrivo
    
            if (!inputString.empty())
            {
                fragmentString(inputString, " ", command);
                cout <<command[0];
                sleep(milliseconds(1000));
            }
    
    mi scrivera' sempre tutto quello che ho scritto, se scrivo prima "help", premo invio, e poi scrivo "hi", il programma stampera' ogni secondo entrambi, separati da un invio.
Devi accedere o registrarti per scrivere nel forum
1 risposte