Skip to main content

C++ std::getline() Kullanımı: Klavye ve Dosya Girdilerini Satır Satır Okuma 📜

🎯 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!