std::istream::peek()
kullanımınız ile iki sorunu vardır:
void enterFrac(Fraction* fracs[], int& index)
{
int n, d;
char c, slash;
cout << "Enter fractions (end by entering a 0): ";
c = cin.peek();
if (c != '0')
{
cin >> n >> slash >> d;
Fraction* f = new Fraction();
f->num = n;
f->den = d;
fracs[index] = f;
index++;
}
}
peek Bu test() ancak çalışır
- Bu fonksiyon erişim sonraki karakter ve does değil önde gelen boşlukları atla. Muhtemelen, bir sonraki karakterin ne olduğunu belirlemeye başlamadan önce beyaz boşlukları atlamak istersiniz, örneğin,
std::ws
: (std::cin >> std::ws).peek()
manipülatörünü kullanarak.
std::istream::peek()
sonucu, char
değil. Bunun yerine, std::char_traits<char>::int_type
(int
'un süslü bir yazımıdır). Sonuç, örneğin, std::char_traits<char>::eof()
olabilir ve '0'
değeri negatif olduğunda (herhangi bir platformun farkında değilsem); ancak, örneğin, 'ü'
ismimden gelen komik karakter char
numaralı platformlarda negatif bir değerdir imzalı) doğru sonucu elde edemezsiniz. Yani normalde, yani böyle bir şey kullanmak istiyorum std::char_traits<char>::to_int_type()
sonucu karşı std::istream::peek()
sonucunu karşılaştırmak şöyledir: adı geçen std::cin.peek() == std::char_traits<char>::to_int_type('0')
, programınız başarıyla nominator okuyabilir olup olmadığını kontrol etmez ve payda ile ayrılmış payda. Sen hep gerçekten, örneğin, sadece eğlence için
if ((std::cin >> nominator >> slash >> denominator) && slash == '/') {
...
}
gibi bir şey kullanarak, bir bölü karakteri o test için bir manipülatör oluşturabilir, bu okuma başarılı olduğunu doğrulamak istiyorum:
std::istream& slash(std::istream& in) {
if ((in >> std::ws).peek() != std::char_traits<char>::to_int_type('/')) {
in.setstate(std::ios_base::failbit);
}
return in;
}
Bu şekilde, slash için testi kaplarsınız. Bunu birden fazla yerde kullanmanız gerekiyorsa, bu oldukça kullanışlıdır.
Uygun bir şekilde çalışması için peek() yöntemini alabileceğim bir durum ekledim, ancak durumumda sorunun nedenini göremiyorum. – Zzz