- Konu sahibi
- #1
C++’ta başka bir dosyaya yazmak için
Aşağıdaki örnek, programın çalıştığı klasörde
Programı derleyip çalıştırdığınızda
Dosyanın oluşmaması veya yazılamaması, çoğunlukla programın yazma yetkisinin olmadığı bir klasör kullanıldığını, dosya yolunun hatalı olduğunu ya da dosyanın başka bir işlem tarafından engellendiğini gösterir.
Dosyada bulunan metni silmeden yeni bilgiyi sona eklemek için dosyayı
Bu program her çalıştırıldığında
Hangi açma biçiminin doğru olduğu, dosyanın kullanım amacına bağlıdır. Bir raporu her çalıştırmada yeniden üretmek istiyorsanız varsayılan biçimi; günlük, işlem kaydı veya geçmiş listesi tutuyorsanız
Dosyaya yalnızca sabit metin değil, değişkenlerin değerlerini de yazabilirsiniz.
Bu örnekte
Göreli bir yol, örneğin
Alt klasöre yazacaksanız klasörün önceden var olması gerekir:
Burada klasör oluşturma başarısız olursa veya yazma izni yoksa dosya yine açılamaz. Bu nedenle dosyayı açtıktan sonra
Dosya açılmış olsa bile yazma sırasında disk dolması veya başka bir işletim sistemi hatası meydana gelebilir. Kritik veriler yazıyorsanız yazma işleminden sonra akışın durumunu da kontrol edin:
İlk kontrol dosyanın açılmasını, ikinci kontrol ise yazma akışının hata durumuna geçip geçmediğini denetler. Başarılı açma ve yazma, dosyanın uygulamanızın beklediği özel bir biçimde saklandığını garanti etmez; örneğin CSV, JSON veya ikili dosya biçimi gerekiyorsa ayraçları, kodlamayı ve biçim kurallarını ayrıca uygulamanız gerekir.
<fstream> başlığındaki std::ofstream sınıfını kullanın. Dosyayı yazma amacıyla açın, metni << işleciyle gönderin ve dosyanın başarıyla açıldığını kontrol edin. Dosya yoksa oluşturulur; dosya zaten varsa varsayılan davranış mevcut içeriği silip yeni içeriği yazmaktır. Mevcut içeriği koruyup sonuna eklemek istiyorsanız std::ios::app kipini kullanmalısınız.Dosyaya temel metin yazma
Aşağıdaki örnek, programın çalıştığı klasörde
sonuc.txt adlı dosyayı oluşturur veya varsa içeriğini yeniler:
C++:
#include <fstream>
#include <iostream>
int main() {
std::ofstream dosya("sonuc.txt");
if (!dosya.is_open()) {
std::cerr << "Dosya yazmak için açılamadı.\n";
return 1;
}
dosya << "Birinci satır\n";
dosya << "İkinci satır\n";
dosya << "Sonuç: " << 42 << '\n';
return 0;
}
Programı derleyip çalıştırdığınızda
sonuc.txt dosyası oluşur. Dosyanın içinde üç satır bulunması beklenir. std::ofstream nesnesi main işlevinin sonunda kapsam dışına çıktığında dosyayı kapatır ve yazma işleminin tamamlanması için gerekli kaynakları serbest bırakır. Bu nedenle basit örneklerde ayrıca close() çağırmanız gerekmez.Dosyanın oluşmaması veya yazılamaması, çoğunlukla programın yazma yetkisinin olmadığı bir klasör kullanıldığını, dosya yolunun hatalı olduğunu ya da dosyanın başka bir işlem tarafından engellendiğini gösterir.
is_open() kontrolü yalnızca dosyanın açılıp açılmadığını gösterir; içeriğin istediğiniz biçimde yazıldığını tek başına kanıtlamaz. Program sonlandıktan sonra dosyayı açıp satırları kontrol edin.Mevcut dosyanın sonuna yazma
Dosyada bulunan metni silmeden yeni bilgiyi sona eklemek için dosyayı
std::ios::app kipiyle açın:
C++:
#include <fstream>
#include <iostream>
int main() {
std::ofstream dosya("kayit.txt", std::ios::app);
if (!dosya) {
std::cerr << "Dosya açılamadı.\n";
return 1;
}
dosya << "Yeni kayıt eklendi\n";
return 0;
}
Bu program her çalıştırıldığında
kayit.txt dosyasının sonuna yeni bir satır ekler. Dosya yoksa oluşturulur. Önceki içeriğin üzerine yazmak istiyorsanız std::ios::app kullanmayın; yalnızca std::ofstream dosya("kayit.txt"); biçiminde açın.| Açma biçimi | Dosya varsa | Dosya yoksa |
|---|---|---|
| std: | Mevcut içerik silinir ve yeni yazı baştan yazılır. | Dosya oluşturulur. |
| std: | Yeni yazı dosyanın sonuna eklenir. | Dosya oluşturulur. |
std::ios::app kipini seçin.Değişkenleri ve biçimli verileri yazma
Dosyaya yalnızca sabit metin değil, değişkenlerin değerlerini de yazabilirsiniz.
<< işleci metin, tam sayı, ondalık sayı ve benzeri temel türleri sırayla dosyaya aktarır:
C++:
#include <fstream>
#include <string>
int main() {
std::string kullanici = "Ayşe";
int puan = 87;
double ortalama = 91.5;
std::ofstream dosya("rapor.txt");
if (!dosya) {
return 1;
}
dosya << "Kullanıcı: " << kullanici << '\n';
dosya << "Puan: " << puan << '\n';
dosya << "Ortalama: " << ortalama << '\n';
}
Bu örnekte
rapor.txt dosyasına değişkenlerin o anda sahip olduğu değerler yazılır. Dosyaya yazmak, değişkenin kendisini kalıcı ve otomatik olarak saklamaz; yalnızca o anki değerinin metin biçimindeki gösterimini kaydeder. Programın daha sonra bu veriyi tekrar kullanması gerekiyorsa dosyayı ayrıca std::ifstream ile okumalı ve metni uygun türlere dönüştürmelidir.Dosya yolunu doğru vermek
Göreli bir yol, örneğin
"sonuc.txt", dosyanın kaynak kodunun bulunduğu klasörü değil, programın çalıştırıldığı çalışma klasörünü temel alır. Bu nedenle dosyayı göremiyorsanız önce programın hangi klasörden çalıştırıldığını kontrol edin.Alt klasöre yazacaksanız klasörün önceden var olması gerekir:
C++:
std::ofstream dosya("cikti/sonuc.txt");
cikti klasörü yoksa ofstream bu klasörü kendiliğinden oluşturmaz ve dosya açılamaz. Klasörü program içinde oluşturmak için C++17 veya daha yeni bir standart kullanıyorsanız <filesystem> tercih edilebilir:
C++:
#include <filesystem>
#include <fstream>
int main() {
std::filesystem::create_directories("cikti");
std::ofstream dosya("cikti/sonuc.txt");
if (!dosya) {
return 1;
}
dosya << "Dosya oluşturuldu\n";
}
Burada klasör oluşturma başarısız olursa veya yazma izni yoksa dosya yine açılamaz. Bu nedenle dosyayı açtıktan sonra
if (!dosya) kontrolünü kaldırmayın.Yazma hatasını işlem sırasında kontrol etme
Dosya açılmış olsa bile yazma sırasında disk dolması veya başka bir işletim sistemi hatası meydana gelebilir. Kritik veriler yazıyorsanız yazma işleminden sonra akışın durumunu da kontrol edin:
C++:
#include <fstream>
#include <iostream>
int main() {
std::ofstream dosya("onemli-veri.txt");
if (!dosya) {
std::cerr << "Dosya açılamadı.\n";
return 1;
}
dosya << "Kaydedilecek bilgi\n";
if (!dosya) {
std::cerr << "Yazma sırasında hata oluştu.\n";
return 1;
}
return 0;
}
İlk kontrol dosyanın açılmasını, ikinci kontrol ise yazma akışının hata durumuna geçip geçmediğini denetler. Başarılı açma ve yazma, dosyanın uygulamanızın beklediği özel bir biçimde saklandığını garanti etmez; örneğin CSV, JSON veya ikili dosya biçimi gerekiyorsa ayraçları, kodlamayı ve biçim kurallarını ayrıca uygulamanız gerekir.