2013-11-19 3 views
0

Я пытаюсь создать приложение командной строки, где пользователь может вводить команды и данные, но я действительно не понимаю, как работает istream_iterator, как я могу получить весь ввод (до введите) в вектор? Прямо сейчас он создает новый цикл while для каждого слова, а это не то, что нужно.C++ Загрузка пользовательского ввода в вектор

int main(int argc, char* argv[]) 
{ 
    string buffer;  
    //vector<string> vbuff; 
    CliHandler clihandler(argc, argv); 
    int state = clihandler.State(); 
    while (state != CliHandler::STATE_EXIT) { 

     cout << ">>"; 
      //Beolvasás 
      cin >> buffer; 
      stringstream sstream(buffer); 
      istream_iterator<string> begin(sstream); 
      istream_iterator<string> end; 
      vector<string> vbuff(begin,end); 

      copy(vbuff.begin(), vbuff.end(), std::ostream_iterator<string>(std::cout, "\n"));//test 

      //vbuff = vector<string>((istream_iterator<string>(cin)), istream_iterator<string>()); 
      //copy(vbuff.begin(), vbuff.end(), std::ostream_iterator<string>(std::cout, "\n")); 

      switch(clihandler.State(vbuff[0])) { 
          // [command] [data1] [data2] ... 
      } 
    } 

    return 0; 
} 
+0

Я предполагаю, что вы получили этот этот код из StackOverflow вопрос (HTTP [Как разбить строку в C++?]: // StackOverflow. ком/вопросы/236129/как к расколу-а-строки-в-с). Я предлагаю вам использовать [этот ответ] (http://stackoverflow.com/a/236803/1750541), поскольку он гораздо более масштабируемый. – Ian

+0

Я пробовал, но я не знаю, как использовать эту функцию. Зачем вам нужна строка const для ее использования, я не понимаю. – appl3r

+0

Из того, что я могу сказать, вы пытаетесь написать код, который разделит строку. т. е. потребуется длинная серия символов, разделенная на вектор меньших фрагментов. Однако ваше описание наверху говорит о чтении в пользовательском вводе. Вы уверены, что поняли, что вы пытаетесь сделать? Я вижу две возможности: 1) Чтение ввода, разделение ввода вверх и сохранение, завершение. Или 2) Чтение ввода, сохранение ввода, чтение ввода, сохранение ввода и т. Д. – Ian

ответ

0

Почему вы не просто использовать argc и argv параметры? Что-то вроде этого .. (не тестировал)

int main(int argc, char* argv[]) 
{ 
    vector<string> vbuff(argc); 
    for (int i = 0; i < argc; ++i) 
    { 
     vbuff[i] = argv[i]; 
    } 

    // From here, you can use vbuff for your own purposes. 
} 
+0

Потому что программа закончится сразу, но я хочу, чтобы пользователь дал несколько команд за другим, в то время как я не получил команду «выйти». – appl3r

+0

О, поэтому вы хотите интерактивно вводить пользовательский ввод, а не параметры командной строки. Думаю, я неправильно понял ваш вопрос. – yyoon

0

я м не очень уверен, что у хочу (мой бедный английский ..), может быть, вы хотите, чтобы получить ввод всей линии, пока не войдете Я думаю, что вы можно использовать cin.getline

char mbuf[1024]; 
    cin.getline(buffer,1024); 
0

Основываясь на ваш комментарий: «Я читаю ввод в интерактивном режиме команда выхода оставит время цикла и завершить программу.»

Вы бы лучше получить, что простой цикл сначала работать, прежде чем пытаться обработать входную строку.

std::string inputCommand; 
while(inputCommand != "Exit") 
{ 
    cin >> inputCommand; 
    //do stuff with it 
} 

Тогда вы могли бы рассмотреть возможность разделения и обработки строки

bool shouldExit(false); 
std::vector<std::string> inputsReceived; 
while(!shouldExit) 
{ 
    char delim ('#'); //here put whatever character your inputs are separated by 
    std::string buffer; 
    cin >> buffer; 
    std::stringstream ss; 
    ss << buffer; 
    std::string item; 
    while (std::getline(ss, item, delim)) 
    { 
     if (item == "Exit") //case sensitive 
     { 
      shouldExit = true; 
      break; 
     } 
     else 
     { 
      //do whatever with input 
     } 

     //if you want to keep a record of the inputs in a vector 
     inputsReceived.push_back(item); 
    } 
} 
Смежные вопросы