从C ++中的stdin读取

时间:2014-04-06 18:33:13

标签: c++ stdin

这是我的代码:

...
...
do
{
    cin >> command;

    switch(command)
    {
        case 'i':
            cin >> key >> nome >> idade >> endereco;
            count++;

            pessoas = (Pessoa **) realloc(pessoas, count*sizeof(Pessoa *));
            pessoas[count-1] = new Pessoa(key, nome, idade, endereco);

            bTree->add(pessoas[count-1]);
            break;

        case 's':
            cin >> key;

            toSearch = (Pessoa *) bTree->search(key);

            if(toSearch == NULL)
            {
                cout << "-1" << endl;
            }
            else
            {
                cout << key << endl;
                cout << toSearch->getNome() << endl;
                cout << toSearch->getIdade() << endl;
                cout << toSearch->getEndereco() << endl;
            }

            break;

        case 'e':
            done = true;
            break;
    }

} while(!done);
...
...

我有一个&#34;菜单&#34;当我输入i时,它会插入BTree,s将搜索,e将退出该计划。

问题是,当我点击i进行插入时,我必须提供四个参数:

  1. (int)Key;
  2. (字符串)姓名;
  3. (int)年龄;
  4. (字符串)地址;
  5. 当我给出一个内有e字符的名称时(例如,#34; James&#34;),它将退出程序。

    当我在交换机上读取stdin缓冲区时,如何避免command读取stdin缓冲区?

    示例输入:

    i
    1
    Joao da Silva 1
    11
    Rua 2, 3
    i
    2
    Joao da Silva 2
    12
    Rua 4, 6
    s
    1
    s
    7
    e
    

    感谢。

2 个答案:

答案 0 :(得分:0)

std::basic_istream::get(定义1)怎么样?

这会使你的switch语句开始如下。

do
{    
    switch(cin.get())
    {

请记住,在一般情况下switch早期检查std::char_traits::eof可能是谨慎的(虽然stdin不需要)。

答案 1 :(得分:-1)

使用fgetc

完成
...
...
while(!done)
{
    cin >> command;

    switch(command)
    {
        case 'i':
            scanf("%d\n", &key);

            strCounter = 1;
            while(true)
            {
                buff = fgetc(stdin);

                // until the user types '\n'
                if(buff == '\n')
                {
                    nome[strCounter-1] = '\0';
                    break;
                }

                // realloc it
                nome = (char *) realloc(nome, (strCounter)*sizeof(char));
                nome[strCounter-1] = buff;
                strCounter++;
            }

            scanf("%d\n", &idade);

            strCounter = 1;
            while(true)
            {
                buff = fgetc(stdin);

                // until the user types '\n'
                if(buff == '\n')
                {
                    endereco[strCounter-1] = '\0';
                    break;
                }

                // realloc it
                endereco = (char *) realloc(endereco, (strCounter+1)*sizeof(char));
                endereco[strCounter-1] = buff;
                strCounter++;
            }

            count++;

            pessoas = (Pessoa **) realloc(pessoas, count*sizeof(Pessoa *));
            pessoas[count-1] = new Pessoa(key, nome, idade, endereco);

            bTree->add(pessoas[count-1]);

            break;

        case 's':
            cin >> key;

            toSearch = (Pessoa *) bTree->search(key);

            if(toSearch == NULL)
            {
                cout << "-1" << endl;
            }
            else
            {
                cout << key << endl;
                cout << toSearch->getNome() << endl;
                cout << toSearch->getIdade() << endl;
                cout << toSearch->getEndereco() << endl;
            }

            break;

        case 'e':
            done = true;
            break;

        default:
            break;
    }
}
...
...