11 Ekim 2017 Çarşamba

std::getline

Giriş
Şu satırı dahil ederiz.
#include <string>
std::getline delimeter karakterini tüketir ama sonuca dahil etmez.

1. cin ve getline karışımı
cin >> işleminden sonra std::getline metodunu kullanmak genellikle hataya sebep olur. Çünkü cin >> metodu \n karakterini tüketmez. Arkadan gelen std::getline bu karakteri tüketir ve boş değer okur. Yanlış kullanım şöyledir.
std::string firstName;
std::string lastName;

std::cout << "Enter the first name of person :\n";
std::cin >> firstName;
std::cout << "Enter the last name of person :\n";
std::getline (std::cin,lastName);
2. std::getline metodu - stream
Örnek
Şöyle yaparız. Delimiter olarak \n kullanılır.
std::string lastName;
std::getline (std::cin,lastName);
Örnek - Döngü
std::getline okuma işlemi başarılı ise true döndüğü için döngü içinde kullanılabilir. Şöyle yaparız.
std::ifstream f("foo.txt");

std::vector<std::string> lines;

for (std::string s; std::getline(f, s); lines.push_back(std::move(s)))
  if (!s.empty() && s.back() == '\r')
    s.pop_back();
Örnek - döngü
Şöyle yaparız. Özellikle ödev sorunlarında bu tür kodlar çokça kullanılır :)
while (std::getline(std::cin, answer) && !validate_answer(answer));
3. std::getline Sonucu Döndürülemez
Örnek
Şu kod derlenmez
bool getval(std::string &val)
{
  ...
  std::ifstream infile(filename);
  //Hata şöyle : cannot convert 'std::basic_istream<char>' to 'bool' in return
  return std::getline(infile, val);
}
Açıklaması şöyle
The boolean conversion operator for std::basic_istream is explicit. This means that instances of the type will not implicitly become a bool but can be converted to one explicitly, for instance by typing bool(infile).

Explicit boolean conversion operators are considered for conditional statements, i.e. the expression parts of if, while etc. More info about contextual conversions here.

However, a return statement will not consider the explicit conversion operators or constructors. So you have to explicitly convert that to a boolean for a return.

4. std::getline metodu - stream + delimiter
Bu metodu kullanırsan kendimiz delimiter karakterini belirtebiliriz.

Örnek
Elimizde şöyle bir dosya olsun. Sadece = karakterinden sonra gelen sayıları okumak isteyelim
Theta = 0.0000        Phi = 0.00000
Theta = 1.0000        Phi = 90.0000
Theta = 2.0000        Phi = 180.0000
Theta = 3.0000        Phi = 360.0000
Şöyle yaparız.
double theta;
double phi;
std::string skip; // used to read past unwanted text

// set printing format to 4 decimal places
std::cout << std::fixed << std::setprecision(4);

while( std::getline (str, skip, '=')
        && data >> theta
        && std::getline (data, skip, '=')
        && data >> phi
)
{
  std::cout << '{' << theta << ", " << phi << '}' << '\n';
}

Hiç yorum yok:

Yorum Gönder