2015-12-23 5 views
-2

Я пишу блок-тест, и я пытаюсь прочитать некоторые данные POST из stdin или cin. Данные таковы:Прочитайте несколько строк из std :: cin

callCount=1 
page=/cs/admissions/admissions_tracker_result.jhtml?schoolId=436&classYear=2020 
httpSessionId=xQIX_WS2vyua_JfEEKL0zAVRkxCLzMv-RM8ZJYuWfkaoA_IB6Ynn!788428762 
scriptSessionId=5A7188C7ABF4B9F05D7CEB361E670361570 
c0-scriptName=AdmissionScattergramService 
c0-methodName=renderChart 
c0-id=0 
c0-e1=string:true 
c0-e2=string:true 
c0-e3=string:true 
c0-e4=string:true 
c0-e5=string:true 
c0-e7=string:8 
c0-e8=string:2 
c0-e9=string:4 
c0-e10=string:3 
c0-e11=string:6 
c0-e12=string:7 
c0-e6=Array:[reference:c0-e7,reference:c0-e8,reference:c0-e9,reference:c0-e10,reference:c0-e11,reference:c0-e12] 
c0-e13=string:true 
c0-e14=string:true 
c0-e15=string:true 
c0-e16=string:true 
c0-e17=string:true 
c0-e18=string:true 
c0-e19=string:true 
c0-e20=string:true 
c0-e22=string:1 
c0-e23=string:2 
c0-e24=string:3 
c0-e25=string:4 
c0-e26=string:0 
c0-e21=Array:[reference:c0-e22,reference:c0-e23,reference:c0-e24,reference:c0-e25,reference:c0-e26] 
c0-e27=string:true 
c0-e28=string:true 
c0-e30=string:AL 
c0-e31=string:AK 
c0-e32=string:AR 
c0-e33=string:AS 
c0-e34=string:AZ 
c0-e35=string:CA 
c0-e36=string:CO 
c0-e37=string:CT 
c0-e38=string:DC 
c0-e39=string:DE 

Когда я вставляю в отладчик, запускает программу автоматически. Я пытаюсь изменить свой код и использовать std::getline(std::can, post) вместо std::cin>>post; Однако это не сработало. Вот код:

std::string url; 
    std::string post; 
    printf("enter the url\n"); 
    std::cin>>url; 
    printf("enter the post data\n"); 
    std::string line; 

    while (true) { 
     getline(std::cin, line); 
     if (line.empty()) { 
     break; 
     } 
    post += '\n' + line; 
    } 

Похоже getline() неблокирующая. И переменная std::string post просто остается пустой.

+0

Вы не можете делать правильный ввод-вывод, если не проверяете возвращаемое значение операций ввода. –

+0

Я не знаком с I/O, std :: string и std :: cin должен быть безопасным вариантом. Я просто пытаюсь получить несколько строк из stdin, и я хотел бы сделать это на C++, так как это безопаснее. Я пытаюсь взглянуть на документ, чтобы получить линию, но я ничего не мог найти. Пожалуйста помоги. –

ответ

2

getline фактически блокирует. Проблема вы столкнулись из-за этой линии:

std::cin>>url; 

Он читает url от линии, но не читает символ новой строки. Когда вы вызываете getline, поток находится прямо перед символом новой строки, который следует за url, и вы читаете его, получая пустую строку. Чтобы обратиться к нему, просто позвоните getline один раз после прочтения url перед входом в ваш цикл.

+0

Кажется, что он еще не выполняется while (true) { getline (std :: cin, line); if (line.empty()) { break; } post + = '\ n' + line; } –

+0

Вы уверены, что добавили дополнительную 'getline' перед циклом? Возможно, вы видели мой ответ с неправильным советом, прежде чем я его отредактировал. – Ishamael

+0

Большое спасибо. Я это запомню. Раньше я никогда не использовал getline. –

Смежные вопросы