Bagaimana cara menghapus buffer cin di C ++?
Bagaimana cara menghapus buffer cin di C ++?
Jawaban:
Mungkin:
std::cin.ignore(INT_MAX);
Ini akan membaca dan mengabaikan semuanya sampai EOF
. (Anda juga bisa memberikan argumen kedua yang merupakan karakter untuk dibaca sampai (mis:'\n'
mengabaikan satu baris).
Juga: Anda mungkin ingin melakukan: std::cin.clear();
sebelum ini juga untuk menyetel ulang status streaming.
Saya lebih suka batasan ukuran C ++ daripada versi 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
dan menggunakan pernyataan pertama di atas untuk membersihkan cin
buffer, maka itu terus meminta masukan sampai saya masuk EOF
dengan menekan ctrl+d
?
cin.clear();
fflush(stdin);
Ini adalah satu-satunya hal yang berhasil bagi saya saat membaca dari konsol. Dalam setiap kasus lain itu akan terbaca tanpa batas karena kurangnya \ n, atau sesuatu akan tetap ada di buffer.
EDIT: Saya menemukan bahwa solusi sebelumnya memperburuk keadaan. Namun, yang satu ini berhasil:
cin.getline(temp, STRLEN);
if (cin.fail()) {
cin.clear();
cin.ignore(numeric_limits<streamsize>::max(), '\n');
}
Saya telah menemukan dua solusi untuk ini.
Yang pertama, dan paling sederhana, adalah menggunakan std::getline()
misalnya:
std::getline(std::cin, yourString);
... yang akan membuang aliran input ketika sampai ke baris baru. Baca lebih lanjut tentang fungsi ini di sini .
Opsi lain yang langsung membuang aliran adalah ini ...
#include <limits>
// Possibly some other code here
cin.clear();
cin.ignore(numeric_limits<streamsize>::max(), '\n');
Semoga berhasil!
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";
Bagaimana tentang:
cin.ignore(cin.rdbuf()->in_avail());
Saya lebih memilih:
cin.clear();
fflush(stdin);
Ada contoh di mana cin.ignore tidak memotongnya, tapi saya tidak bisa memikirkannya saat ini. Beberapa waktu yang lalu ketika saya perlu menggunakannya (dengan Mingw).
Namun, fflush (stdin) adalah perilaku tidak terdefinisi menurut standar. fflush () hanya dimaksudkan untuk aliran keluaran. fflush (stdin) sepertinya hanya berfungsi seperti yang diharapkan di Windows (setidaknya dengan kompiler GCC dan MS) sebagai ekstensi ke standar C .
Jadi, jika Anda menggunakannya, kode Anda tidak akan portabel.
Lihat Menggunakan fflush (stdin) .
Selain itu, lihat http://ubuntuforums.org/showpost.php?s=9129c7bd6e5c8fd67eb332126b59b54c&p=452568&postcount=1 untuk alternatif.
Solusi (manual) lain yang mungkin adalah
cin.clear();
while (cin.get() != '\n')
{
continue;
}
Saya tidak bisa menggunakan fflush atau cin.flush () dengan CLion jadi ini berguna.
Cara termudah:
cin.seekg(0,ios::end);
cin.clear();
Ini hanya memposisikan penunjuk cin di akhir aliran stdin dan cin.clear () menghapus semua flag kesalahan seperti flag EOF.
Berikut ini seharusnya bekerja:
cin.flush();
Pada beberapa sistem, ini tidak tersedia dan Anda dapat menggunakan:
cin.ignore(INT_MAX);
flush
metode ini hanya untuk keluaran, dan berhubungan dengan karakter yang sudah tertulis.
basic_istream<char>' has no member named 'flush'
cin.get()
tampaknya memerah secara otomatis cukup aneh (meskipun mungkin tidak disukai, karena ini membingungkan dan mungkin temperamental).
Itu berhasil untuk saya. Saya telah menggunakan for loop dengan getline ().
cin.ignore()