İkili Dosya G/Ç
Ham baytları okuyun ve yazın
İkili Dosya G/Ç, CoddyKit'te ücretsiz bir C++ Academy dersidir. Bu, 4 dersinin 3. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, C++ Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. C++ Academy kursu toplamda 4 dersten oluşur.
Metin ve ikili kip karşılaştırması
Metin kipi, insanların okuyabileceği karakterleri yazar; ikili kip, nesnelerin bellekteki ham baytlarını tam olarak oldukları biçimde yazar. std::ios::binary ile açın.
#include <iostream>
#include <fstream>
int main() {
int value = 12345;
std::ofstream out("v.bin", std::ios::binary);
out.write(reinterpret_cast<const char*>(&value), sizeof(value));
std::cout << "wrote " << sizeof(value) << " bytes\n";
return 0;
}write baytları alır
write(ptr, n), ptr konumundan n ham baytı çıktılar. Nesne adresini const char* türüne dönüştürürsünüz.
#include <iostream>
#include <fstream>
int main() {
double d = 3.14;
std::ofstream out("d.bin", std::ios::binary);
out.write(reinterpret_cast<const char*>(&d), sizeof(d));
out.close();
std::cout << "saved a double\n";
return 0;
}read baytları geri yükler
read(ptr, n), ptr konumundaki nesneye n bayt yükleyerek ikili yazma işlemini tersine çevirir.
#include <iostream>
#include <fstream>
int main() {
int original = 777;
std::ofstream("i.bin", std::ios::binary).write(reinterpret_cast<const char*>(&original), sizeof(original));
int loaded = 0;
std::ifstream in("i.bin", std::ios::binary);
in.read(reinterpret_cast<char*>(&loaded), sizeof(loaded));
std::cout << loaded << '\n';
return 0;
}POD yapısı yazma
Yalın veri yapıları (işaretçi içermeyen, sabit boyutlu üyelere sahip yapılar), tek bir bayt bloğu olarak dışa aktarılıp yeniden yüklenebilir.
#include <iostream>
#include <fstream>
struct Record { int id; double balance; };
int main() {
Record r{1, 99.5};
std::ofstream out("rec.bin", std::ios::binary);
out.write(reinterpret_cast<const char*>(&r), sizeof(r));
std::cout << "struct saved\n";
return 0;
}Yapıyı geri okuma
Okuma işlemi, yapının tamamını tek bir read çağrısıyla geri yükler.
#include <iostream>
#include <fstream>
struct Record { int id; double balance; };
int main() {
Record w{42, 250.0};
std::ofstream("r2.bin", std::ios::binary).write(reinterpret_cast<const char*>(&w), sizeof(w));
Record r{};
std::ifstream in("r2.bin", std::ios::binary);
in.read(reinterpret_cast<char*>(&r), sizeof(r));
std::cout << r.id << ' ' << r.balance << '\n';
return 0;
}Dizi yazma
Toplam bayt boyutunu aktararak bir dizinin tamamını tek çağrıda yazabilirsiniz.
#include <iostream>
#include <fstream>
int main() {
int arr[5] = {1, 2, 3, 4, 5};
std::ofstream out("arr.bin", std::ios::binary);
out.write(reinterpret_cast<const char*>(arr), sizeof(arr));
std::cout << "wrote " << sizeof(arr) << " bytes\n";
return 0;
}Diziyi geri okuma
Aynı sayıda baytı aynı boyuttaki bir diziye okuyun.
#include <iostream>
#include <fstream>
int main() {
int src[5] = {10, 20, 30, 40, 50};
std::ofstream("a2.bin", std::ios::binary).write(reinterpret_cast<const char*>(src), sizeof(src));
int dst[5] = {};
std::ifstream in("a2.bin", std::ios::binary);
in.read(reinterpret_cast<char*>(dst), sizeof(dst));
for (int x : dst) std::cout << x << ' ';
std::cout << '\n';
return 0;
}Konumlara gitme
seekg (get) ve seekp (put), okuma/yazma konumunu değiştirerek dosyada rastgele erişim sağlar.
#include <iostream>
#include <fstream>
int main() {
int data[3] = {100, 200, 300};
std::ofstream("seek.bin", std::ios::binary).write(reinterpret_cast<const char*>(data), sizeof(data));
std::ifstream in("seek.bin", std::ios::binary);
in.seekg(sizeof(int)); // skip to second int
int second; in.read(reinterpret_cast<char*>(&second), sizeof(second));
std::cout << second << '\n';
return 0;
}Konumu öğrenme
tellg ve tellp geçerli konumu bildirir; bu bilgiler dosya boyutunu veya uzaklıkları ölçmek için kullanışlıdır.
#include <iostream>
#include <fstream>
int main() {
int data[4] = {1, 2, 3, 4};
std::ofstream("tell.bin", std::ios::binary).write(reinterpret_cast<const char*>(data), sizeof(data));
std::ifstream in("tell.bin", std::ios::binary);
in.seekg(0, std::ios::end);
std::cout << "file size: " << in.tellg() << " bytes\n";
return 0;
}Neden işaretçiler kullanılmamalı
İşaretçi veya std::string içeren nesneleri hiçbir zaman ikili olarak dışa aktarmayın: işaretçinin gösterdiği veriyi değil, işaretçi adresini kaydetmiş olursunuz. Bunun yerine içeriği serileştirin.
#include <iostream>
#include <fstream>
#include <string>
int main() {
std::string s = "hello";
std::ofstream out("str.bin", std::ios::binary);
std::size_t len = s.size();
out.write(reinterpret_cast<const char*>(&len), sizeof(len));
out.write(s.data(), len); // write the chars, not the object
std::cout << "serialized " << len << " chars\n";
return 0;
}Taşınabilirlik uyarıları
İkili yerleşimler bayt sıralamasına ve tür boyutlarına bağlıdır. Bir platformda yazılan dosyalar başka bir platformda doğru okunmayabilir; bu nedenle paylaşım için sabit bir biçim tanımlayın.
#include <iostream>
#include <cstdint>
int main() {
std::int32_t fixed = 1; // fixed-width type for portability
std::cout << "sizeof int32_t = " << sizeof(fixed) << '\n';
return 0;
}Hızlı Kontrol
İkili G/Ç konusundaki anlayışınızı sınayın.
Özet
İkili dosya G/Ç işlemlerini öğrendiniz:
std::ios::binaryile açın;reinterpret_cast<char*>ilewrite/readkullanınseekg/seekpvetellg/tellprastgele erişim sağlar- işaretçileri veya dizeleri doğrudan hiçbir zaman dışa aktarmayın; içeriklerini serileştirin ve bayt sıralamasına dikkat edin
Sırada akış durumunu denetlemeyi ve hataları ele almayı öğreneceksiniz.
Sıkça Sorulan Sorular
“İkili Dosya G/Ç” dersi ücretsiz mi?
Evet — “İkili Dosya G/Ç” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve C++ Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. C++ Academy kursu toplamda 4 dersten oluşur.
“İkili Dosya G/Ç” dersinde ne öğreneceğim?
Ham baytları okuyun ve yazın C++ Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
C++ Academy öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te C++ Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 3. dersidir.
“İkili Dosya G/Ç” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu C++ Academy dersinde kod yazıp çalıştırabilir miyim?
Evet. Her C++ Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.