Ana içeriğe geç

C++ std::getline() Kullanımı

Bu Rehberde Ne Öğreneceksiniz?

Bu kılavuzda C++’ta std::getline() fonksiyonunun nasıl çalıştığını öğreneceksiniz.
Klavye veya dosyadan gelen verileri satır satır okuyacak, boşluk içeren girdileri doğru şekilde yakalayacak ve newline hatası gibi sık yapılan hatalardan nasıl kaçınacağınızı keşfedeceksiniz.


Teknik Özet

  • Ana konu: C++ Standard Kütüphanesi’ndeki std::getline() fonksiyonu
  • Amaç: Giriş akışlarından (cin, ifstream, stringstream) satır veya özel ayraçlara göre veri okumak
  • Avantaj: Boşluk karakterlerini dahil ederek tam satır verisi almak
  • Zorluk: cin >> sonrası kalan \n karakterinin yanlış okunması
  • Çözüm: “dummy getline()” veya cin.ignore() kullanmak

std::getline() Nedir?

std::getline() fonksiyonu, bir giriş akışından karakterleri okuyup bir std::string değişkenine atar.
Bu, cin >> operatöründen farklı olarak boşlukları da okur.

istream& getline(istream& input_stream, string& output, char delim);

Parametreler:

input_stream: Girdinin kaynağı (std::cin, dosya akışı, string stream)

output: Okunan karakterlerin yazılacağı std::string değişkeni

delim (isteğe bağlı): Okumayı durduran sınırlayıcı (varsayılan \n)

  • Fonksiyon <string> başlık dosyasına aittir çünkü std::string türüyle doğrudan çalışır.

1. Klavyeden Satır Okuma


#include <iostream>
#include <string>
using namespace std;

int main() {
string isim;
cout << "Adınızı girin: ";
getline(cin, isim);
cout << "Merhaba, " << isim << "!\n";
}
  • Açıklama: getline() boşlukları da okuduğu için "Ahmet Yılmaz" gibi veriler sorunsuz alınır.

2. Dosyadan Satır Satır Okuma

Bir bulut sunucudaki rabisu_veri.txt dosyasını satır satır okuyalım 👇


#include <iostream>
#include <fstream>
#include <vector>
#include <string>
using namespace std;

int main() {
ifstream dosya("rabisu_veri.txt");
vector<string> satirlar;
string temp;

while (getline(dosya, temp)) {
satirlar.push_back(temp);
}

for (const auto& s : satirlar)
cout << s << endl;
}

Örnek Dosya (rabisu_veri.txt):

Merhaba Rabisu Cloud
İkinci satır
Son satır

Çıktı:


Merhaba Rabisu Cloud
İkinci satır
Son satır

3. Özel Sınırlayıcı (Delimiter) Kullanımı

getline() varsayılan olarak satır sonu \n karakterine kadar okur. Ama istersek bu sınırlayıcıyı değiştirebiliriz.


while (getline(dosya, temp, ' ')) {
satirlar.push_back(temp);
}
  • Açıklama:

Yukarıdaki örnekte ayraç ' ' (boşluk) olduğu için her kelime ayrı ayrı okunur.


4. std::cin Sonrası Boş Satır Hatası

std::cin >> kullandıktan sonra hemen getline() çağırmak, genellikle boş değer döndürür. Sebebi, cin okuma işleminden sonra akışta kalan \n karakteridir.

Hatalı Örnek:


int id;
string isim;
cin >> id;
getline(cin, isim); // isim boş kalır!

Çözüm 1 – Dummy getline():


int id;
string isim;
cin >> id;
string dummy;
getline(cin, dummy); // Temizleme
getline(cin, isim);

Çözüm 2 – Profesyonel yöntem (cin.ignore()):


#include <limits>
cin.ignore(numeric_limits<streamsize>::max(), '\n');
getline(cin, isim);
  • Açıklama:

cin.ignore() akıştaki \n karakterini yoksayar ve gerçek satır girişini okumaya hazır hale getirir.


Performans Özellikleri

ÖzellikAçıklama
YaklaşımSatır veya özel ayraç bazlı okuma
Zaman KarmaşıklığıO(N)
Kapsamcin, ifstream, stringstream ile uyumlu
AvantajBoşluk dahil satır okuma kolaylığı
Potansiyel Soruncin sonrası kalan newline (\n) karakteri

Sıkça Sorulan Sorular (SSS)

  1. getline() neden <string> başlığında tanımlıdır?

Çünkü doğrudan std::string nesneleriyle çalışır, bu yüzden <iostream> değil <string> içinde bulunur.

  1. getline() boşlukları neden korur?

Çünkü sınırlayıcıya kadar olan tüm karakterleri “veri” olarak kabul eder.

  1. cin.ignore() ile dummy getline() farkı nedir?

İkisi de aynı işi yapar; ignore() daha kontrollü ve profesyonel bir yöntemdir.

  1. getline() yalnızca dosya akışlarıyla mı çalışır?

Hayır, std::istream’den türeyen tüm akışlarda (cin, ifstream, stringstream) kullanılabilir.

  1. getline() performans açısından güvenilir mi?

Evet, O(N) karmaşıklığıyla büyük dosyaları bile verimli okur.


Sonuç

Bu rehberde, C++’ta std::getline() fonksiyonunu kullanarak veri okuma işlemlerini hem klavye hem dosya üzerinden öğrendiniz. Ayrıca cin sonrası newline hatasını nasıl çözeceğinizi de gördük.

Rabisu Bulut platformunda C++ geliştirme ortamınızı başlatın ve bu örnekleri hemen deneyin!