C++'da İkili Dosya Yazma

C Da Ikili Dosya Yazma



C++ programlamada, ikili dosyalarla uğraşmak, ham verileri depolamak ve işlemek için temeldir. İster görüntülerle, ister ses dosyalarıyla, ister özel veri yapılarıyla çalışıyor olun, ikili dosyaları verimli bir şekilde yazabilme yeteneği çok önemlidir. İkili dosyalar, verileri insan tarafından okunamayan bir formatta saklar; bu da onları karmaşık yapıları, görüntüleri veya basit bir metin tabanlı gösterimi izlemeyen herhangi bir veriyi depolamak gibi çeşitli uygulamalar için uygun hale getirir.

C++, ikili verileri yazmak için ikili dosyalarla, özellikle de 'ofstream' sınıfıyla etkileşim kurmak için kitaplığını sağlar. Bu yetenek, geliştiricilerin ikili dosyaları sorunsuz bir şekilde oluşturmasına, değiştirmesine ve yönetmesine olanak tanır. Bu makale, ikili dosyaları C++'da yazmaya yönelik çeşitli yöntem ve teknikleri araştırıyor ve bunların uygulamalarına ve kullanım durumlarına ışık tutuyor.

C++ Kullanarak İkili Dosya Yazma

Verileri C++ kullanarak ikili bir dosyaya kaydetmek için write() yöntemi kullanılır. Bu işlev, 'put' işaretçisinin konumundan başlayarak belirlenen akışa belirli sayıda bayt yazar. Eğer “put” işaretçisi sonda ise dosya genişletilir. Ancak işaretçi dosyanın içindeyse yeni veriler mevcut karakterlerin üzerine yazar. Yazma işlemi sırasında bir hata olması durumunda akış, hata durumunda olarak işaretlenir. Şimdi bazı basit ve yerleşik C++ fonksiyonlarını kullanarak ikili dosyaya nasıl yazılacağını öğrenmek için örneklere geçelim.







Yöntem 1: Yapılandırılmış Verilerle İkili Dosyalar Yazma

Birçok durumda, özel yapılar gibi yapılandırılmış verileri ikili dosyaya yazmanız gerekebilir. Bir kişinin adını, boyunu ve yaşını içeren bir kaydı içeren bir örneği ele alalım. Aşağıdaki verilen koda bakın ve açıklamaya bir göz atın:



#include

#include

yapı Kişi {

karakter isim [ elli ] ;

int yaş ;

çift yükseklik ;

} ;

int ana ( ) {

std :: akış çıkışDosyası ( 'insanlar.bin' , std :: ios :: ikili ) ;

eğer ( ! outDosya. açık ( ) ) {

std :: kesin << 'Hata! Dosya yazmak için açılamıyor!' << std :: sonunda ;

geri dönmek 1 ;

}

Kişi kişi1 = { 'Kalsom İlyas' , 25 , 1.75 } ;

Kişi kişi2 = { 'Kalsoom Bajwa' , 30 , 1.68 } ;

outDosya. yazmak ( yeniden yorumlama_cast < karakter *> ( & kişi 1 ) , boyutu ( kişi 1 ) ) ;

outDosya. yazmak ( yeniden yorumlama_cast < karakter *> ( & kişi2 ) , boyutu ( kişi2 ) ) ;

outDosya. kapalı ( ) ;

std :: cout << 'Kişinin kaydı başarıyla ikili dosyaya yazıldı.' << std :: sonunda ;

geri dönmek 0 ;

}

Burada belirli ayrıntılarla birlikte kodun bir dökümü verilmiştir. Program “Kişi” adında özel bir yapının tanımlanmasıyla başlar. Üç alanı vardır: ad, yaş ve boy. Bu alanların detayları aşağıdaki gibidir:



  • isim: Kişinin adını saklayacak bir dize (en fazla 50 karakter)
  • yaş: Kişinin yaşını saklayacak bir tam sayı
  • yükseklik: Kişinin boyunu saklamak için bir çift

“Person” yapısını tanımladıktan sonra programın giriş noktası olan ana fonksiyona geçilir. Ana programın ilk satırında “people.bin” isimli bir dosya açılır. Verileri ikili formatta yazmak için “people.bin” adında bir dosya oluşturmak için “std::ofstream” kullanıyoruz. Dosyanın başarıyla açılıp açılmadığını kontrol etmek çok önemlidir. Aksi halde bir hata mesajı görüntülenir ve program durur. Dolayısıyla “if” koşulu ve is_open() fonksiyonu yardımıyla dosyanın başarıyla açılıp açılmadığını kontrol ediyoruz.





Burada iki “Kişi” nesnesi yaratılır. “Kişi” tipinde “kişi1” ve “kişi2” olmak üzere iki değişken tanımlıyoruz. “Kalsoom Ilyas” ve “Kalsoom Bajwa” değişkenlerine isim, yaş ve boy değerlerini atadık.

Artık ikili dosyaya yazılacak veriye sahip olduğumuza göre, write() işleviyle asıl işlevi gerçekleştirelim. Her “Person” nesnesinin içeriğini dosyaya yazmak için “outFile.write” kullanıyoruz. “reinterpret_cast(&person1)” ve “reinterpret_cast(&person2)”, tüm “Kişi” yapısını (tüm alanları dahil) ikili dosyaya yazmaya uygun sürekli bir bayt akışına dönüştürür . Tüm verilerin doğru yazıldığından emin olmak için “sizeof(person1)” ve “sizeof(person2)” kullanarak her “Person” nesnesinin boyutunu yazıyoruz.



Verileri dosyaya yazdıktan sonra, başka bir işlevden dolayı hiçbir verinin kaybolmaması için düzgün bir şekilde kapatılması çok önemlidir. Dosyayla ilişkili kaynakları serbest bırakmak ve verilerin doğru yazıldığından emin olmak için outFile.close() yöntemini kullanıyoruz. Son olarak verinin ikili dosyaya başarıyla yazıldığını onaylayan bir mesaj yazdırıyoruz.

Bu örneği daha basit bir şekilde açıklarsak, sadece insanlara ait bilgileri gizli bir dilde saklayabilen özel bir not defteri hayal edin. Bu kod, bilgileri (isim, yaş, boy) düzenlemek için bir plan oluşturur. Defteri açıyor, iki kişinin profillerini dolduruyor, bilgileri gizli dile çeviriyor ve içine düzgünce yazıyor. Daha sonra dizüstü bilgisayarı güvenli bir şekilde kapatarak profilleri gelecekte kullanmak üzere saklar. Aşağıdaki anlık görüntüde verilen programın çıktısına bakın:

Yöntem 2: Tam Sayıları İkili Dosyaya Yazma

Bu yöntemde tamsayılardan oluşan bir dizi “integers.bin” isimli ikili dosyaya yazılır. “reinterpret_cast”, tamsayı dizisini, dosyaya yazılacak bir karakter (bayt) dizisi olarak ele alır. İkili dosyalar ham bayt verileriyle ilgilendiğinden bu özellikle önemlidir. Aşağıdaki basit örneğe bir göz atalım:

#include

#include

int ana ( ) {

std :: akış çıkışDosyası ( 'tamsayılar.bin' , std :: ios :: ikili ) ;

eğer ( ! outDosya. açık ( ) ) {

std :: kesin << 'Hata! Dosya yazmak için açılamıyor!' << std :: sonunda ;

geri dönmek 1 ;

}

int sayılar [ ] = { 42 , 99 , - 1 , 0 } ;

outDosya. yazmak ( yeniden yorumlama_cast < karakter *> ( sayılar ) , boyutu ( sayılar ) ) ;

outDosya. kapalı ( ) ;

std :: cout << 'Verilen tamsayılar ikili dosyaya başarıyla yazıldı.' << std :: sonunda ;

geri dönmek 0 ;

}

Kodun belirli ayrıntılarla birlikte bir dökümü:

“#include ” ve “#include ” sırasıyla cin ve write() gibi dosyalarla çalışmak ve mesajları yazdırmak için gerekli araçları sağlar. “std::ofstream outFile(“integers.bin”, std::ios::binary);” sayıları yalnızca gizli bir kodda (ikili formatta) saklayabilen “integers.bin” adlı bir ikili dosyayı açar. Dosyanın açık olup olmadığını kontrol eder. Aksi takdirde hata mesajı verilir.

Sonraki satır ise “int sayılar[] = {42, 99, -1, 0};” 42, 99, -1 ve 0 tam sayılarını içeren “numbers” adlı bir diziyi tanımlar. “outFile.write(reinterpret_cast(numbers), sizeof(numbers));” tamsayıları dikkatlice ikili formata çevirir ve “integer.bin” dosyasına yazar. “outFile.close();” tam sayıları güvende ve düzenli tutmak için dosyayı doğru şekilde kapatır. Son olarak, tamsayıların ikili dosyada başarıyla saklandığını doğrulayan bir mesaj yazdırılır. Sonucu görmek için bu programın aşağıdaki çıktısına bakın:

Çözüm

C++'da ikili dosyalar yazmak, çeşitli veri türlerini verimli bir şekilde işlemek için çok önemli bir beceridir. C++'da ikili dosya yazma konusundaki bu araştırmamızda, ikili verileri verimli bir şekilde işlemek için 'ofstream' sınıfının nasıl kullanılabileceğini öğrendik. İster basit tamsayılarla ister özel yapılar kullanan yapılandırılmış verilerle ilgilenin, süreç bir dosya akışının açılmasını, verilerin ikili formatta yazılmasını ve ardından dosyanın kapatılmasını içerir. Bu yetenek, C++ geliştiricilerine çok çeşitli ikili veri türleriyle çalışma esnekliği sağlar ve sistem düzeyinde programlamadan multimedya işlemeye kadar çeşitli uygulamalarda dilin çok yönlülüğüne katkıda bulunur.