2011-07-19 46 views
5

Tôi đã sao chép chương trình đơn giản này từ ngôn ngữ lập trình C++, nhưng tôi không thể làm cho nó hoạt động như mong muốn. Tui bỏ lỡ điều gì vậy? Về cơ bản, chương trình sẽ xuất "đầu vào kết thúc" sau khi tôi nhấn trở lại, và sau đó lặp lại đầu vào từ cin. Nó không bao giờ có thể đi đến tuyên bố tiếp theo. Tôi đã cố gắng sử dụng các vector (nhận xét hai báo cáo dưới đây), giống nhau. Đã thử trên Vc6 và vs2008.vòng lặp vô hạn dòng cin, tại sao?

#include <iostream> 
#include <map> 
#include <algorithm> 
#include <string> 
#include <iterator> 
#include <vector> 
using namespace std; 

map<string, int> histogram; 
void record(const string &s) 
{ 
    histogram[s]++; //this is pretty strange, however it does work! 
    cout<<"recorded:"<<s<<" occurance="<<histogram[s]<<"\n"; 
} 

void print(const pair<const string,int> &r) 
{ 
    cout<<r.first<<' '<<r.second<<'\n'; 
} 

int main() 
{ 
    istream_iterator<string> ii(cin); 
    istream_iterator<string> eos; 
    cout<<"input end\n"; 

    for_each(ii,eos,record); //this statement cannot get out why? It repeats the keyboard input 
    //vector<string> b(ii,eos); 
    //for_each(b.begin(),b.end(),record); 
    for_each(histogram.begin(),histogram.end(),print); //program never comes here why? 
} 

kết quả Chạy:

abc

cuối đầu vào

ghi: một sự xuất hiện = 1

ghi: b sự xuất hiện = 1

ghi: c sự xuất hiện = 1

ghi: 1 sự xuất hiện = 1

ghi: 2 sự xuất hiện = 1

ghi: 3 sự xuất hiện = 1

Trả lời

5

istream_iterator sẽ tiếp tục cho đến khi nó chạm vào cuối dòng , mà trên cin thường không xảy ra.

cin sẽ gặp sự cố kết thúc, khiến báo cáo của bạn chấm dứt, khi nó được chuyển hướng đến tệp (khi đến cuối tệp) hoặc nếu nó nhận được đầu vào bảng điều khiển, bạn có thể gửi kết thúc- của dòng bằng cách nhấn CTRL-Z (CTRL-D trên Linux, iirc). Bạn có thể cần phải nhấn enter sau đó.

Lưu ý rằng cin sẽ không sử dụng được sau khi bạn thực hiện việc này, vì vậy bạn không thể đọc thêm dữ liệu nhập sau thời điểm đó.

Cho đến khi hết dòng, ii sẽ vẫn hợp lệ và tiếp tục yêu cầu thêm dữ liệu từ luồng (trong trường hợp bảng điều khiển).

Giải pháp sẽ không sử dụng for_each mà là vòng lặp while thủ công mà bạn có thể thoát ra khi có bất kỳ điều kiện nào bạn muốn.

+0

Tôi đã thử nhấn ctrl-Z trước khi đăng câu hỏi này, nó không hoạt động. – shangping

+0

xin lỗi, tôi đã thử lại, thực sự là một lần nhập phải theo sau là ctrl-z. Cảm ơn! Tôi cảm thấy ngại ngùng về câu hỏi này. – shangping

+0

Có thể lấy lại cin sau khi nhấn Ctrl-Z, Enter? – Karel

Các vấn đề liên quan