Làm cách nào để xóa bộ đệm cin trong C ++?
Làm cách nào để xóa bộ đệm cin trong C ++?
Câu trả lời:
Có khả năng:
std::cin.ignore(INT_MAX);
Điều này sẽ đọc trong và bỏ qua mọi thứ cho đến khi EOF
. (bạn cũng có thể cung cấp đối số thứ hai là ký tự sẽ đọc cho đến (ví dụ: '\n'
để bỏ qua một dòng).
Ngoài ra: Bạn có thể muốn thực hiện: std::cin.clear();
trước cả việc này để đặt lại trạng thái luồng.
Tôi thích các ràng buộc về kích thước C ++ hơn các phiên bản C:
// Ignore to the end of file
cin.ignore(std::numeric_limits<std::streamsize>::max())
// Ignore to the end of line
cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n')
cin
và sử dụng câu lệnh đầu tiên ở trên để xóa cin
bộ đệm, thì nó sẽ tiếp tục nhắc nhập cho đến khi tôi nhập EOF
bằng cách nhấn ctrl+d
?
cin.clear();
fflush(stdin);
Đây là điều duy nhất hiệu quả với tôi khi đọc từ bảng điều khiển. Trong mọi trường hợp khác, nó sẽ đọc vô thời hạn do thiếu \ n hoặc thứ gì đó sẽ vẫn còn trong bộ đệm.
CHỈNH SỬA: Tôi phát hiện ra rằng giải pháp trước đây làm cho mọi thứ trở nên tồi tệ hơn. Tuy nhiên, cái này hoạt động:
cin.getline(temp, STRLEN);
if (cin.fail()) {
cin.clear();
cin.ignore(numeric_limits<streamsize>::max(), '\n');
}
Tôi đã tìm thấy hai giải pháp cho điều này.
Đầu tiên, và đơn giản nhất, là sử dụng std::getline()
ví dụ:
std::getline(std::cin, yourString);
... điều đó sẽ loại bỏ luồng đầu vào khi chuyển sang dòng mới. Đọc thêm về chức năng này ở đây .
Một tùy chọn khác hủy trực tiếp luồng là ...
#include <limits>
// Possibly some other code here
cin.clear();
cin.ignore(numeric_limits<streamsize>::max(), '\n');
Chúc may mắn!
int i;
cout << "Please enter an integer value: ";
// cin >> i; leaves '\n' among possible other junk in the buffer.
// '\n' also happens to be the default delim character for getline() below.
cin >> i;
if (cin.fail())
{
cout << "\ncin failed - substituting: i=1;\n\n";
i = 1;
}
cin.clear(); cin.ignore(INT_MAX,'\n');
cout << "The value you entered is: " << i << " and its double is " << i*2 << ".\n\n";
string myString;
cout << "What's your full name? (spaces inclded) \n";
getline (cin, myString);
cout << "\nHello '" << myString << "'.\n\n\n";
Làm thế nào về:
cin.ignore(cin.rdbuf()->in_avail());
Tôi thích:
cin.clear();
fflush(stdin);
Có một ví dụ mà cin.ignore không cắt nó, nhưng tôi không thể nghĩ ra vào lúc này. Đó là một thời gian trước đây khi tôi cần sử dụng nó (với Mingw).
Tuy nhiên, fflush (stdin) là hành vi không xác định theo tiêu chuẩn. fflush () chỉ dành cho các luồng đầu ra. fflush (stdin) dường như chỉ làm việc như mong đợi trên Windows (với GCC và MS trình biên dịch ít nhất) là một mở rộng của tiêu chuẩn C .
Vì vậy, nếu bạn sử dụng nó, mã của bạn sẽ không di động được.
Xem Sử dụng fflush (stdin) .
Ngoài ra, hãy xem http://ubuntuforums.org/showpost.php?s=9129c7bd6e5c8fd67eb332126b59b54c&p=452568&postcount=1 để có giải pháp thay thế.
Một giải pháp khả thi (thủ công) khác là
cin.clear();
while (cin.get() != '\n')
{
continue;
}
Tôi không thể sử dụng fflush hoặc cin.flush () với CLion nên điều này rất hữu ích.
Cách dễ nhất:
cin.seekg(0,ios::end);
cin.clear();
Nó chỉ định vị con trỏ cin ở cuối luồng stdin và cin.clear () xóa tất cả các cờ lỗi như cờ EOF.
Những điều sau sẽ hoạt động:
cin.flush();
Trên một số hệ thống, nó không khả dụng và sau đó bạn có thể sử dụng:
cin.ignore(INT_MAX);
flush
phương thức này chỉ dành cho đầu ra và xử lý các ký tự đã được viết sẵn.
basic_istream<char>' has no member named 'flush'
cin.get()
dường như tự động tuôn ra một cách kỳ lạ (mặc dù có lẽ không được ưa thích, vì điều này là khó hiểu và có thể là tính khí thất thường).
Nó đã làm việc cho tôi. Tôi đã sử dụng vòng lặp for với getline ().
cin.ignore()