2011-10-06 39 views
9

Tôi cần đọc biểu tượng theo biểu tượng. Nhưng tôi không biết cách đọc cho đến khi kết thúc đầu vào. Như hệ thống thử nghiệm exemple sẽ cin >> somecharvariable m lần. Tôi phải đọc tất cả các ký tự. Chỉ m lần. Tôi phải làm việc đó như thế nào?C++ cin char đọc biểu tượng theo ký hiệu

+0

Thử đặt chuỗi ký tự vào chuỗi. –

+0

Bạn đang đọc cho đến khi kết thúc của đầu vào, * m * lần, hoặc bạn đang đọc * m * số lượng ký hiệu? –

+0

hoặc nhìn vào 'istream :: get (char * buffer, size_t len, char delimiter)' và 'istream :: đọc (char * buffer, size_t len)' nếu bạn muốn tất cả các byte bao gồm khoảng trắng và newlines –

Trả lời

5

Nếu bạn muốn đầu vào định dạng ký tự bằng ký tự, làm điều này:

char c; 
while (infile >> c) 
{ 
    // process character c 
} 

Nếu bạn muốn đọc byte thô, làm điều này:

char b; 
while (infile.get(b)) 
// while(infile.read(&b, 1) // alternative, compare and profile 
{ 
    // process byte b 
} 

Trong cả hai trường hợp, infile nên của loại std::istream & hoặc tương tự, chẳng hạn như tệp hoặc std::cin.

+0

Để đọc byte thô (symbos), phương thức 'cin.read' thường hiệu quả hơn, ở mức tối thiểu nó sử dụng các cuộc gọi hàm ít hơn. –

+0

@ThomasMatthews: Cảm ơn, tôi cũng nghĩ về điều đó - tôi đã thêm phiên bản thay thế. –

0

Hãy thử điều này:

#include <iostream> 
using std::cin; 
using std::cout; 

int main(int argc, char *argv[]) 
{ 
    char ch; 
    unsigned m = 10; 
    while (cin && m--) { 
     cin.read(&ch, sizeof(ch)); 
     cout << ch; 
    } 
    return 0; 
} 
+1

Tại sao lại chọn một 'char *' thành một 'char *'? –

+0

Giải pháp này không đọc * m * số lượng ký hiệu hoặc nó không lặp lại đọc cho đến EOF, * m * lần. –

+0

@ThomasMatthews Đã sửa lỗi. – Sergey

3

Có một số cách để đọc một ký tự tại một thời điểm cho đến khi bạn đã đọc tất cả, và không ai trong số họ nhất thiết phải là tốt nhất.

Cá nhân, tôi muốn đi với đoạn mã sau:

char c; 
while (cin.get(c)) { 
    // Process c here. 
} 

Nếu bạn chỉ cần phải đọc m nhân vật, xem xét sử dụng một vòng lặp for:

char c; 
for (unsigned int i = 0; i < m && cin.get(c); ++i) { 
    // Process c here. 
} 

này chạy vòng lặp như lâu khi hai điều kiện được đáp ứng: (1) ít hơn m ký tự đã được đọc và (2) vẫn có các ký tự cần đọc.

Tuy nhiên, cả hai giải pháp đều có nhược điểm: chúng tương đối kém hiệu quả. Đọc các ký tự m hiệu quả hơn trong một lần.

Vì vậy, đầu tiên phân bổ một bộ đệm đủ lớn để lưu trữ m chars và sau đó cố gắng để đọc chúng:

std::vector<char> buffer(m); 
cin.read(&m[0], m); 
unsigned total_read = cin.gcount(); 

Chú ý dòng cuối cùng - điều này sẽ cho bạn biết liệu m ký tự đã được thực sự đọc.

+0

Giải pháp này không đọc số lượng ký hiệu m hoặc nó không lặp lại đọc cho đến EOF, m lần. –

+0

@Thomas Xem cập nhật. –

+0

+1 để cập nhật, đặc biệt là bao gồm trường hợp EOF trong vòng lặp 'for'. –

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