PDA

View Full Version : [C++] aquisire una frase da line di comando


robs05
20-12-2008, 09:31
Salve, come posso acquisire una frase da linea di comando?

esempio se uso

string descrizione;
cout << "Inserisci descrizione" << endl;
cin >> descrizione;



e da riga di comando digito: esempio prova

la variabile contiene solo "prova".

se uso


string descrizione;
cout << "Inserisci descrizione" << endl;
getline(cin,descrizione,'\n');


va tutto ok.

ma se uso

string tipo, descrizione;
cout << "Iserieci il tipo" << endl;
cin >> tipo;
cout << "Inserisci la descrizione" << endl;
getline(cin,descrizione,'\n');



all'esecuzione non aspetta l'input della descrizione.

come posso risolvere? grazie

cionci
20-12-2008, 10:20
Non aspetta perché rimane uno \n all'interno del buffer di input, per l'input da tastiera, se bisogna fare tanto input, imho sarebbe meglio bufferizzare tutta una riga fino allo \n e poi leggere da lì.

Ad esempio una classe di utilità come questa farebbe comodo:
#include <iostream>
#include <sstream>
#include <string>

using namespace std;

class MyInputStream
{
istream &in;
istringstream currentLine;
bool lineRead;
public:
MyInputStream(istream &in): in(in), lineRead(false)
{
}

istringstream & getLine()
{
string str;
getline(in, str);
currentLine.clear();
currentLine.str(str);
lineRead = true;
return currentLine;
}

istringstream & getStream()
{
if(!lineRead)
getLine();
return currentLine;
}
};

int main(int argc, char** argv)
{
MyInputStream is(cin);
int i;
string str;
is.getLine() >> str;
is.getStream() >> i;
if(is.getStream().fail())
cout << "Errore" << endl;
else
cout << i << " " << str << endl;
is.getLine() >> i;
if(is.getStream().fail())
cout << "Errore" << endl;
else
cout << i << endl;
}


Chiaramente se la riga non contiene caratteri avrai un fail sullo stream. Nota che anche con cin dovresti sempre controllare se hai un fail, perché se richiedo un intero e si inserisce una stringa lo stream verrà settato su fail e così puoi gestire l'errore.