PDA

Tam Sürümünü Görmek İçin : C++'ta stdin tamponunu boşaltmak


depones
01/10/2007, 00:05
Merhaba,

C++'ta operator>> ile klavyeden formatı, değişkenin türüne uymayan bir değer aldığımda bu değer stdin tamponunda kalıyor. Aynı C'de scanf() fonksiyonunda olduğu gibi. C'de tamponu boşaltmak için

while ((ch = getchar()) != '\n' && ch != EOF)
;

kod kalıbını kullanıyorum. C++'ta stdin tamponunu boşaltmak için ise bu kodu şöyle uyarladım:

void FileManager::ClearStreamBuffer(istream &is)
{
char ch;
while ((ch = is.get()) != '\n' && ch != EOF)
;
}

Ancak, bu kod doğru çalışmıyor. C++'ta stdin tamponunu nasıl boşaltabilirim ?

İyi çalışmalar.


Euclides
01/10/2007, 00:46
Güzel olmamakla beraber muhtemelen bu çalışacaktır...
char ch;
while(std::cin >> ch);

acehreli
01/10/2007, 20:06
Oncelikle, C kutupanesi ile gelen giris/cikis islemleri ile C++'in giris/cikis islemlerini karistirmak onerilmez. Ornegin printf ile yazdiktan sonra cin ile okumak, printf'in yazdiginin ekrana cikmis olacagini garantilemez. Ama ornegin cout ile cin arasinda boyle bir garanti vardir.

Girisin bosaltilmasi icin C++'ta onerilen yontem, giris akiminin 'ignore' islevini cagirmaktir:


#include <limits>
#include <string>
#include <iostream>

using namespace std;

int main()
{
cout << "Yasiniz: ";
int sayi;
cin >> sayi;

cin.ignore(numeric_limits<int>::max(), '\n');

string isim;
cout << "Adiniz: ";
cin >> isim;

cout << isim << ' ' << sayi << " yasinda...\n";
}


Programi denemek icin 'Yasiniz:' sorusuna

10 Veli

girilse bile, 'Adiniz:' sorusu icin 'Veli' gozardi edilecek ve yeni bir isim girilmesi gerekecektir.

Ali

Not: Burada numeric_limits<int>::max() yerine, esdegeri oldugunu bildigimiz INT_MAX'i da kullanabiliriz tabii.

depones
01/10/2007, 22:47
ignore() fonksiyonu tam olarak ihtiyacımı karşılıyor. Cevaplarınız için teşekkür ederim.