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
Trả lời
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
.
Để đọ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. –
@ThomasMatthews: Cảm ơn, tôi cũng nghĩ về điều đó - tôi đã thêm phiên bản thay thế. –
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;
}
Tại sao lại chọn một 'char *' thành một 'char *'? –
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. –
@ThomasMatthews Đã sửa lỗi. – Sergey
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.
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. –
@Thomas Xem cập nhật. –
+1 để cập nhật, đặc biệt là bao gồm trường hợp EOF trong vòng lặp 'for'. –
- 1. tell cin ngừng đọc tại newline
- 2. Đọc một ký tự tệp theo ký tự trong C
- 3. Tại sao 'char' được ký theo mặc định trong C++?
- 4. Đọc một mật khẩu từ std :: cin
- 5. Ký hiệu char c = 255 là "11111111" hay không?
- 6. cin.clear() không đặt lại đối tượng cin
- 7. gán một mảng char vào chuỗi ký tự - C++
- 8. Nhân char theo số nguyên (C++)
- 9. char! = (Ký char), char! = (Unsigned char)
- 10. Làm thế nào để cin Space trong c + +?
- 11. Sự khác biệt giữa char và ký char trong C++?
- 12. Tương đương Java của cin (C++)
- 13. C++ enum từ char
- 14. Liên kết không thể tìm thấy biểu tượng, nhưng các thư viện được đọc và ký hiệu tồn tại
- 15. Ký hiệu Hungary trong C#
- 16. Tạo nhật ký đọc hiệu quả
- 17. C++ đọc unsigned char từ luồng tập tin
- 18. Ký hiệu lũy thừa theo địa chỉ?
- 19. lỗi biểu tượng trùng lặp C++
- 20. Chấm dứt chuỗi - char c = 0 vs char c = '\ 0'
- 21. Cách đọc từ một tệp văn bản, ký tự theo ký tự trong C++
- 22. Làm cách nào để đọc ký tự đầu vào theo ký tự trong Java?
- 23. Ký hiệu dấu chấm lửng trong C#?
- 24. Đọc một dòng tệp theo dòng C#
- 25. Ký hiệu mảng đối tượng jQuery
- 26. Đọc từ ký tự tệp văn bản theo ký tự
- 27. Chuỗi ký tự so với const char * trong C
- 28. C++ chuyển đổi char thành const char *
- 29. C# đối tượng chỉ đọc
- 30. In biểu diễn nhị phân của một char trong C
Thử đặt chuỗi ký tự vào chuỗi. –
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? –
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 –