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\nkarakterinin 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
| Özellik | Açıklama |
|---|---|
| Yaklaşım | Satır veya özel ayraç bazlı okuma |
| Zaman Karmaşıklığı | O(N) |
| Kapsam | cin, ifstream, stringstream ile uyumlu |
| Avantaj | Boşluk dahil satır okuma kolaylığı |
| Potansiyel Sorun | cin sonrası kalan newline (\n) karakteri |
❓ Sıkça Sorulan Sorular (SSS)
- 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.
- getline() boşlukları neden korur?
Çünkü sınırlayıcıya kadar olan tüm karakterleri “veri” olarak kabul eder.
- cin.ignore() ile dummy getline() farkı nedir?
İkisi de aynı işi yapar; ignore() daha kontrollü ve profesyonel bir yöntemdir.
- 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.
- 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!