{"id":27634106,"url":"https://github.com/deryaxacar/42-cpp-module-01","last_synced_at":"2026-02-17T16:01:24.296Z","repository":{"id":254718372,"uuid":"842509862","full_name":"deryaxacar/42-CPP-Module-01","owner":"deryaxacar","description":"This project is designed to develop fundamental programming skills in the C++ language. It includes practical exercises on data types, control structures, and functions. Additionally, topics such as class definitions and memory management are also covered.","archived":false,"fork":false,"pushed_at":"2025-03-26T08:32:09.000Z","size":138,"stargazers_count":2,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-04-23T18:47:44.569Z","etag":null,"topics":["42","42-school","42born2code","42cursus","42projects","42school","cpp","cpp-all","cpp-library","cpp-module-01","cpp-modules","cpp-modules-1337","cpp-modules-42","cpp-programming","cpp01"],"latest_commit_sha":null,"homepage":"https://github.com/deryaxacar/42-CPP-Module-09","language":"C++","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/deryaxacar.png","metadata":{"files":{"readme":"Readme.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2024-08-14T13:53:33.000Z","updated_at":"2025-04-11T14:47:03.000Z","dependencies_parsed_at":"2025-04-23T18:37:41.733Z","dependency_job_id":"8c8dda36-a924-4ee3-8782-db57813ac279","html_url":"https://github.com/deryaxacar/42-CPP-Module-01","commit_stats":null,"previous_names":["deryaxacar/42-cpp_01","deryaxacar/42-cpp-module-01"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/deryaxacar/42-CPP-Module-01","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/deryaxacar%2F42-CPP-Module-01","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/deryaxacar%2F42-CPP-Module-01/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/deryaxacar%2F42-CPP-Module-01/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/deryaxacar%2F42-CPP-Module-01/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/deryaxacar","download_url":"https://codeload.github.com/deryaxacar/42-CPP-Module-01/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/deryaxacar%2F42-CPP-Module-01/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29549205,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-17T14:33:00.708Z","status":"ssl_error","status_checked_at":"2026-02-17T14:32:58.657Z","response_time":100,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["42","42-school","42born2code","42cursus","42projects","42school","cpp","cpp-all","cpp-library","cpp-module-01","cpp-modules","cpp-modules-1337","cpp-modules-42","cpp-programming","cpp01"],"created_at":"2025-04-23T18:27:28.434Z","updated_at":"2026-02-17T16:01:24.290Z","avatar_url":"https://github.com/deryaxacar.png","language":"C++","readme":"\u003cdiv align=\"center\"\u003e\n  \u003ch1\u003eC++ Module 01\u003c/h1\u003e \u003cimg src=\"https://cdn-icons-png.flaticon.com/512/6132/6132222.png\" alt=\"C++ Logo\" width=\"65\"\u003e\u003c/br\u003e\u003c/br\u003e\n\u003c/div\u003e\n\u003cp align=\"center\"\u003eBu proje, C++ dilinde temel programlama becerilerini geliştirmek için hazırlanmıştır. Veri türleri, kontrol yapıları ve fonksiyonlar üzerine uygulamalı çalışmalar yapılır. Ayrıca, sınıf tanımlamaları ve bellek yönetimi gibi konular da ele alınır.\u003c/p\u003e\n\n---\n\n## İçindekiler 🔗\n\n- [Bellek Tahsisi Türleri](#bellek-tahsisi-türleri)\n    - [Statik Bellek](#statik-bellek)\n    - [Dinamik Bellek](#dinamik-bellek)\n    - [Stack Ve Heap Belleği Arasındaki Fark](#stack-ve-heap-belleği-arasındaki-fark)\n    - [Kullanılabilir işlevler](#kullanılabilir-işlevler)\n    - [Örnekler](#örnekler)\n    - [Sonuç](#sonuç)\n- [Pointer ve Referans](#pointer-ve-referans)\n  - [Pointer Nedir?](#pointer-nedir)\n  - [Referans Nedir?](#referans-nedir)\n  - [Pointer Ve Referans Arasındaki Farklar](#pointer-ve-referans-arasındaki-farklar)\n  - [Örnek](#örnek)\n  - [Özet](#özet)\n- [Npos Nedir?](#npos-nedir)\n  - [Tanım Ve Kullanım](#tanım-ve-kullanım)\n- [Switch Nedir Ve Nasıl Kullanılır?](#switch-nedir-ve-nasıl-kullanılır)\n  - [Switch Nasıl Kullanılır?](#switch-nasıl-kullanılır)\n  - [Temel Yapısı](#temel-yapısı)\n  - [Örnek Kullanım](#örnek-kullanım)\n- [ifstream Ve Ofstream Nedir?](#ifstream-ve-ofstream-nedir)\n  - [ifstream (Input File Stream)](#ifstream-input-file-stream)\n  - [ofstream (Output File Stream)](#ofstream-output-file-stream)\n  - [ifstream ve ofstream ortak kullanım örneği](#ifstream-ve-ofstream-ortak-kullanım-örneği)\n\n \n---\n\n\u003ch2 align=\"center\"\u003eBellek Tahsisi Türleri\u003c/h2\u003e \n\nBellek yönetimi, C++ programlamada verimli yazılım geliştirme için hayati bir konudur. C++'ta bellek yönetimi, iki ana bellek bölgesi olan **stack** ve **heap** üzerinde gerçekleşir.\n\n### Statik Bellek\nStatik bellek, programın derleme zamanında tahsis edilen ve programın tüm çalışma süresi boyunca varlığını sürdüren bellek alanıdır. Statik bellek, genellikle global değişkenler, statik değişkenler ve sabit boyutlu veri yapıları için kullanılır. Bu tür bellek, program kapandığında otomatik olarak serbest bırakılır.\n\n---\n\n### Dinamik Bellek\n\nDinamik bellek, programın çalışma zamanında ihtiyaç duyulduğunda tahsis edilen bellek alanıdır. Bu bellek, new operatörü kullanılarak ayrılır ve delete operatörü ile manuel olarak serbest bırakılır. Dinamik bellek, esnek boyutlarda veri yapıları ve değişkenler için kullanılır, ancak doğru yönetilmezse bellek sızıntılarına yol açabilir.\n\n---\n\n\u003ch2 align=\"center\"\u003eStack Ve Heap Belleği Arasındaki Fark\u003c/h2\u003e\n\n---\n\n| Özellik                   | Stack Bellek                                       | Heap Bellek                                        |\n|---------------------------|-----------------------------------------------------|-----------------------------------------------------|\n| **Bellek Tahsisi**        | Statik bellek tahsisi için kullanılır. Derleme zamanında belirlenir. | Dinamik bellek tahsisi için kullanılır. Çalışma zamanında `new` operatörü ile tahsis edilir. |\n| **Kullanım Alanları**     | Yerel değişkenler ve geçici veriler.               | Büyük ve değişken boyutlu veri yapıları.           |\n| **Bellek Yönetimi**       | Otomatik olarak yönetilir; fonksiyon tamamlandığında serbest bırakılır. | Manuel olarak yönetilmelidir; `delete` operatörü ile serbest bırakılmalıdır. |\n| **Performans**            | Hızlı ve verimlidir, sınırlı bir boyuta sahiptir.  | Daha yavaş çalışır ve daha fazla işlem süresi gerektirir. |\n| **Tahsis Zamanı**         | Derleme zamanında tahsis edilir.                   | Çalışma zamanında tahsis edilir.                    |\n| **Boyut**                 | Sabit boyut; çalışma sırasında değiştirilemez.     | Esnek boyut; çalışma zamanında belirlenebilir ve değiştirilebilir. |\n\n---\n\n### Kullanılabilir işlevler\n- **new:** Dinamik bellek tahsisi yapar ve bir nesne oluşturur.\n- **delete:** new ile tahsis edilen belleği serbest bırakır.\n- **new[]:** Dinamik diziler için bellek tahsisi yapar.\n- **delete[]:** new[] ile tahsis edilen dizilerin belleğini serbest bırakır.\n\n---\n\n### Örnekler\n\n```cpp\n#include \"Zombie.hpp\"\n\nint main()\n{\n    Zombie *zombie1 = newZombie(\"Foo\"); // Dinamik bellek tahsisi: new operatörü ile heap'te bir Zombie nesnesi oluşturulur.\n    zombie1-\u003eannounce(); // Zombie nesnesinin announce() fonksiyonu çağrılır.\n\n    randomChump(\"Bar\"); // Statik bellek tahsisi: randomChump fonksiyonunda stack üzerinde bir geçici Zombie nesnesi oluşturulur.\n    delete zombie1; // Dinamik bellek serbest bırakma: heap'te tahsis edilen Zombie nesnesi serbest bırakılır.\n\n    return 0;\n}\n```\n\n`newZombie(\"Foo\")` fonksiyonu ile heap üzerinde bir Zombie nesnesi oluşturulup, zombie1 işaretçisine atanır. \n```cpp\n#include \"Zombie.hpp\"\n\nZombie* newZombie(std::string name){\n    return new Zombie(name); // Bu nesne dinamik olarak tahsis edilmiştir ve delete operatörü ile serbest bırakılmalıdır.\n}\n```\n `randomChump(\"Bar\")` fonksiyonu çağrıldığında, stack üzerinde geçici bir Zombie nesnesi oluşturulur. Bu nesne fonksiyon tamamlandığında otomatik olarak serbest bırakılır.\n\n```cpp\n#include \"Zombie.hpp\"\n\nvoid randomChump(std::string name)\n{\n    Zombie zombie(name);\n    zombie.announce();\n}\n\n```\n `delete zombie1` satırı, new operatörü ile tahsis edilen heap bellek alanını serbest bırakır. Bu işlem, bellek sızıntılarını önlemek için gereklidir.\n```cpp\n  delete zombie1; \n```\n\n### Sonuç\nStack ve heap bellekleri, C++'ta bellek yönetiminin temel yapı taşlarıdır. Stack, hızlı ve otomatik bir bellek yönetimi sunarken, heap, esneklik ve dinamik bellek tahsisi gerektiren durumlar için uygundur. Her iki bellek türünün de doğru bir şekilde kullanılması, programın performansını ve güvenilirliğini artıracaktır.\n\n---\n\n\u003ch2 align=\"center\"\u003ePointer Ve Referans\u003c/h2\u003e \n\nC++ dilinde, **pointer** (işaretçi) bir değişkenin bellek adresini tutar ve bu adrese erişim sağlar. Pointerlar, bellek yönetimi ve dinamik veri yapıları için kullanılırken, **referans** ise bir değişkenin başka bir adıdır ve orijinal değişkeni doğrudan gösterir. Referanslar, işaretçilerden daha güvenli bir kullanım sağlar çünkü referanslar oluşturulduklarında hemen bir değişkene bağlanır ve bu bağlama daha sonradan değiştirilemez.\n\n---\n\n### Pointer Nedir?\n\nPointer (işaretçi), bir değişkenin bellek adresini tutan bir değişkendir. İşaretçilerin temel özellikleri şunlardır:\n\n- **Tanım:** Bir işaretçi, bir değişkenin bellek adresini saklar ve bu adrese erişim sağlar.\n- **Tanımlama:** İşaretçi değişkenleri `*` sembolü ile tanımlanır.\n- **Kullanım:** Bir işaretçiye bir adres atanabilir ve bu adres üzerinden veri erişilebilir.\n\n---\n\n### Referans Nedir?\nReferans, bir değişkenin başka bir isimle ifade edilmesidir. Referanslar şu özelliklere sahiptir:\n\n- **Tanım:** Referans, bir değişkenin başka bir adıdır. Referanslar, orijinal değişkeni doğrudan gösterir.\n- **Tanımlama:** Referanslar \u0026 sembolü ile tanımlanır ve bir değişkene atanabilir.\n- **Kullanım:** Referanslar, orijinal değişkenle aynı bellek alanını paylaşır ve bu yüzden referansa yapılan değişiklikler orijinal değişkeni de etkiler.\n\n\u003ch2 align=\"center\"\u003ePointer ve Referans Arasındaki Farklar\u003c/h2\u003e\n\n\n| Özellik            | Pointer                             | Referans                           |\n|--------------------|-------------------------------------|------------------------------------|\n| **Bellek Yönetimi**| Bellek adresini tutar.              | Doğrudan bir değişkenin adıdır.    |\n| **Null Değeri**    | `nullptr` ile boş olabilir.         | Boş olamaz; her zaman geçerli bir değişkene bağlanır. |\n| **Değer Atama**    | Yeni bir adres atanabilir.          | Bir kez bağlanır ve bağlandığı değişken değiştirilemez. |\n| **Kullanım**       | Dinamik bellek yönetimi gibi ileri düzey işlemler için kullanılır. | Genellikle fonksiyon parametreleri ve geri dönüş değerleri için kullanılır. |\n\n---\n\n### Örnek\n\n```cpp\n#include \u003ciostream\u003e\n#include \u003cstring\u003e\n\nint main()\n{\n    // Bir string değişkeni tanımlanır ve değer atanır.\n    std::string string = \"HI THIS IS BRAIN\";\n    \n    // 'string' değişkeninin adresini tutan bir işaretçi tanımlanır.\n    std::string *stringPTR = \u0026string;\n    \n    // 'string' değişkenine referans olarak bağlanan bir referans değişkeni tanımlanır.\n    std::string \u0026stringREF = string;\n\n    // 'string' değişkeninin bellek adresi yazdırılır.\n    std::cout \u003c\u003c \"string address: \" \u003c\u003c \u0026string \u003c\u003c std::endl;\n    \n    // 'stringPTR' işaretçisinin tuttuğu bellek adresi yazdırılır.\n    std::cout \u003c\u003c \"stringPTR address: \" \u003c\u003c stringPTR \u003c\u003c std::endl;\n    \n    // 'stringREF' referansının bellek adresi yazdırılır.\n    // Referans değişkenin adresi, bağlı olduğu 'string' değişkenin adresiyle aynı olacaktır.\n    std::cout \u003c\u003c \"stringREF address: \" \u003c\u003c \u0026stringREF \u003c\u003c std::endl;\n    \n    // 'string' değişkeninin değeri yazdırılır.\n    std::cout \u003c\u003c \"string value: \" \u003c\u003c string \u003c\u003c std::endl;\n    \n    // 'stringPTR' işaretçisinin işaret ettiği adresin değeri yazdırılır.\n    std::cout \u003c\u003c \"stringPTR value: \" \u003c\u003c *stringPTR \u003c\u003c std::endl;\n    \n    // 'stringREF' referansının değeri yazdırılır.\n    // Referans, 'string' değişkeninin kendisini ifade eder, bu yüzden değer aynı olacaktır.\n    std::cout \u003c\u003c \"stringREF value: \" \u003c\u003c stringREF \u003c\u003c std::endl;\n}\n```\n\nkodun çıktısı şu şekiilde olucaktır. \n```shell\nstring address: 0x7fffc8f5a800\nstringPTR address: 0x7fffc8f5a800\nstringREF address: 0x7fffc8f5a800\nstring value: HI THIS IS BRAIN\nstringPTR value: HI THIS IS BRAIN\nstringREF value: HI THIS IS BRAIN\n```\n\n---\n\n### Özet\n\nyani kısaca, işaretçi ve referanslar, değişkenin bellekteki adresine erişimi sağlayarak, değişkenin değerini değiştirme veya okuma işlemleri yapabilir. Bu, işaretçiler ve referansların aynı veri üzerinde işlem yapabilme yeteneğini gösterir.\n\n---\n\u003ch2 align=\"center\"\u003eNpos Nedir?\u003c/h2\u003e\n\n`std::string::npos`, C++'ta `std::string` sınıfının bir özelliğidir ve özellikle arama işlemleriyle ilgili olarak kullanılır. npos, genellikle bir arama sonucunun bulunmadığını belirtmek için kullanılır.\n\n### Tanım Ve Kullanım\n\n**Tanım:** `std::string::npos`, `std::string` sınıfında tanımlı bir sabittir ve `size_t` türünde olup, \"bulunamadı\" durumunu belirtmek için kullanılır. Bu sabit, genellikle `std::string::find`, `std::string::rfind`, `std::string::find_first_of` gibi metotlarda arama sonucunun bulunmadığını belirtmek için kullanılır.\n\n**Değer:** npos, `size_t` türünün maksimum değerine eşittir. Bu, npos'un en büyük `size_t` değerini temsil ettiği anlamına gelir. Bu büyük değer, pratikte npos'un hiçbir geçerli konumu temsil etmediğini gösterir.\n\n**Kullanım:** Genellikle bir arama veya bulma işleminin sonucunu kontrol etmek için kullanılır. Eğer arama sonucu npos ise, bu, aramanın başarısız olduğunu ve belirtilen alt dizinin bulunamadığını belirtir.\n\n**Örnek:**\n```cpp\n#include \u003ciostream\u003e\n#include \u003cstring\u003e\n#include \u003cfstream\u003e\n\nint main(int ac, char **av)\n{\n    // Komut satırında doğru sayıda argüman olup olmadığını kontrol et\n    if(ac != 4)\n    {\n        std::cout \u003c\u003c \"*** You must enter 4 arguments.\" \u003c\u003c std::endl ;\n        return 0;\n    }\n\n    // Girdi dosyasını aç\n    std::ifstream inputFile(av[1]);\n    if(!inputFile)\n    {\n        std::cout \u003c\u003c \"*** Entered file cannot open.\" \u003c\u003c std::endl;\n        return 0;\n    }\n\n    // Aranacak ve değiştirilecek kelimeleri al\n    std::string s1 = av[2];\n    std::string s2 = av[3];\n\n    // Aranacak ve değiştirilecek kelimelerin aynı olup olmadığını kontrol et\n    if(s1 == s2)\n    {\n        std::cout \u003c\u003c \"*** Are you kidding me? Please enter different word or letter.\" \u003c\u003c std::endl;\n        return 0;\n    }\n\n    // Girdi dosyası açık olduğunda işlemleri başlat\n    if(inputFile.is_open())\n    {\n        std::string line;\n        // Çıkış dosyası ismi oluştur\n        std::string r_file = av[1];\n        r_file += \".replace\";\n        std::ofstream replace_file(r_file);\n\n        // Dosyadaki her bir satırı oku\n        while(std::getline(inputFile, line))\n        {\n            // Satır içinde s1'in konumunu bul\n            size_t found = line.find(s1);\n            // s1 bulundukça değiştir\n            while(found != std::string::npos)\n            {\n                // s1'i kaldır ve s2 ile değiştir\n                line.erase(found, s1.length());\n                line.insert(found, s2);\n                // Yeni satırda s1'in başka bir örneği olup olmadığını kontrol et\n                found = line.find(s1);\n            }\n            // Değiştirilmiş satırı çıkış dosyasına yaz\n            replace_file \u003c\u003c line \u003c\u003c std::endl;\n        }\n        // Dosyaları kapat\n        replace_file.close();\n        inputFile.close();\n    }\n    return 0;\n}\n```\n\n**Açıklama:** Bu program, bir giriş dosyasındaki belirli bir kelimeyi başka bir kelimeyle değiştirmek için tasarlanmıştır. İşte nasıl çalıştığı:\n\n**Argüman Kontrolü:** Program, komut satırında tam olarak dört argüman olup olmadığını kontrol eder. Eksik veya fazla argüman varsa hata mesajı verir.\n\n**Dosya Açma:** İlk argüman olarak verilen dosya ismini kullanarak bir `ifstream` nesnesi oluşturur ve dosyayı açar. Dosya açılamazsa, bir hata mesajı verir.\n\n**Kelimeleri Alma:** İkinci ve üçüncü argümanlar, dosyada aranacak kelime `(s1)` ve onunla değiştirilecek kelime `(s2)` olarak alınır.\n\n**Aynı Kelime Kontrolü:** Eğer `s1` ve `s2` aynıysa, bir hata mesajı verir çünkü aynı kelimeyi değiştirmek anlamsızdır.\n\n**Satır Satır İşleme:** Dosyanın her satırını okur ve `s1` kelimesini bulur. `std::string::find` fonksiyonu ile `s1`in bulunup bulunmadığını kontrol eder. `std::string::find` fonksiyonu, aranan kelimeyi bulamazsa std::string::npos döner.\n\n**Kelime Değiştirme:** `s1` bulunursa, `line.erase()` ve `line.insert()` fonksiyonları ile `s1` kelimesini `s2` ile değiştirir. find fonksiyonu tekrar kullanılarak `s1`in başka bir örneği olup olmadığı kontrol edilir.\n\n**Sonuçları Yazma:** Değiştirilmiş satırı yeni bir dosyaya yazar ve işlemi tamamladıktan sonra dosyaları kapatır.\n\n**Not**\n`std::string::npos`, `std::string::find` fonksiyonunun aranan alt diziyi bulamadığı durumlarda döndürülen özel bir sabittir.\nBu sabit, `size_t` türünün maksimum değerine eşittir ve arama sonucunun bulunmadığını belirtir.\nKodda `line.find(s1)` çağrısı ile `s1` kelimesinin satırda olup olmadığı kontrol edilir ve eğer npos dönerse, aranan kelime bulunamamış demektir.\n\n---\n\n\u003ch2 align=\"center\"\u003eSwitch Nedir Ve Nasıl Kullanılır?\u003c/h2\u003e\n\nswitch ifadesi, bir değişkenin değerine göre programın belirli bir yol izlemesini sağlayan bir kontrol yapısıdır. switch, birden fazla durumu kontrol etmek ve her durum için farklı kod blokları çalıştırmak için kullanılır. Bu yapı, birden fazla `if-else` ifadesi yazmaktan daha temiz ve anlaşılır bir alternatif sunar.\n\n### Switch Nasıl Kullanılır?\n\n`switch ifadesi`, bir anahtar kelime (değişken veya ifade) alır ve bu anahtar kelimenin değerine göre farklı case bloklarını çalıştırır. Her case, anahtar kelimenin belirli bir değeri ile eşleşir. Eğer hiçbir case ile eşleşmezse, isteğe bağlı olarak bir default bloğu çalıştırılır.\n\n### Temel Yapısı\n\n```cpp\nswitch (değişken) {\n    case değer1:\n        // Değişken değer1 ile eşleşirse bu kod bloğu çalışır\n        break;\n    case değer2:\n        // Değişken değer2 ile eşleşirse bu kod bloğu çalışır\n        break;\n    // İstenilen kadar case eklenebilir\n    default:\n        // Hiçbir case ile eşleşmezse bu kod bloğu çalışır\n}\n```\n\n---\n\n### Örnek Kullanım\n\n```cpp\n\nvoid Harl::complain(std::string level)\n{\n    std::string data[4] = {\"DEBUG\", \"INFO\", \"WARNING\", \"ERROR\"};\n    int i = 0;\n    while(!data[i].empty() \u0026\u0026 data[i] != level)\n        i++;\n    switch(i)\n    {\n        case 0:\n            this-\u003eHarl::debug();\n        case 1:\n            this-\u003eHarl::info();\n        case 2:\n            this-\u003eHarl::warning();\n        case 3:\n            this-\u003eHarl::error();  \n            break;\n        default:\n            std::cout \u003c\u003c \"[ Probably complaining about insignificant problems ]\" \u003c\u003c std::endl;\n            break;\n    }\n}\n\n```\n\n**Açıklama:** \nBu `switch` yapısı, `i` değişkenine bağlı olarak belirli fonksiyonları çağırır. `i` değeri `0` ile `3` arasında olduğunda sırasıyla `debug()`, `info()`, `warning()`, veya `error()` fonksiyonları çağrılır. `break` komutunun eksik olduğu durumlarda, belirtilen durumdan sonraki tüm fonksiyonlar da çalıştırılır. `i` `0-3` aralığında değilse, varsayılan bir mesaj gösterilir.\n\nBu yapı, özellikle belirli bir değişkenin birçok farklı değerine göre farklı işlemler yapmak gerektiğinde oldukça kullanışlıdır.\n\n---\n\n\u003ch2 align=\"center\"\u003eIfstream Ve Ofstream Nedir?\u003c/h2\u003e\n\n`ifstream` ve `ofstream`, C++ dilinde dosya işlemleri için kullanılan temel akış sınıflarıdır. ifstream dosyalardan veri okumak için, ofstream ise dosyalara veri yazmak için kullanılır. Her iki sınıf da `\u003cfstream\u003e` başlık dosyasında tanımlanmıştır ve dosya akışı sırasında hata kontrolü ve veri işleme işlevlerini yerine getirir. Bu sınıflar, dosya tabanlı veri işleme uygulamalarında yaygın olarak kullanılır ve programcılara esnek bir dosya yönetim mekanizması sunar.\n\n### ifstream (Input File Stream)\n\n**Amaç:** Dosyadan veri okumak için kullanılır.\n\n**Kullanım:** Bir dosya açılır ve bu dosya üzerinden veri okuma işlemi yapılır.\n\n**Örnek:**\n```cpp\n#include \u003cfstream\u003e\n#include \u003cstring\u003e\n\nint main() {\n    std::ifstream file(\"example.txt\");\n    std::string line;\n\n    if (file.is_open()) {\n        while (getline(file, line)) {\n            std::cout \u003c\u003c line \u003c\u003c std::endl;\n        }\n        file.close();\n    } else {\n        std::cout \u003c\u003c \"Dosya açılamadı.\" \u003c\u003c std::endl;\n    }\n\n    return 0;\n}\n```\n**Açıklama:** Bu program, `example.txt` adındaki bir dosyayı açar ve dosyadaki her satırı okuyup ekrana yazdırır. Eğer dosya başarıyla açılırsa, her satır `getline` fonksiyonu ile okunur ve `std::cout` ile ekrana yazdırılır. Dosya okuma işlemi tamamlandıktan sonra dosya kapatılır. Eğer dosya açılamazsa, hata mesajı ekrana yazdırılır.\n\n---\n\n### ofstream (Output File Stream)\n\n**Amaç:** Dosyaya veri yazmak için kullanılır.\n\n**Kullanım:** Bir dosya açılır veya oluşturulur ve bu dosyaya veri yazma işlemi yapılır.\n\n**Örnek:**\n```cpp\n#include \u003cfstream\u003e\n\nint main() {\n    std::ofstream file(\"example.txt\");\n\n    if (file.is_open()) {\n        file \u003c\u003c \"Hello, World!\" \u003c\u003c std::endl;\n        file.close();\n    } else {\n        std::cout \u003c\u003c \"Dosya açılamadı.\" \u003c\u003c std::endl;\n    }\n\n    return 0;\n}\n```\n\n**Açıklama:** Bu program, `example.txt` adında bir dosya oluşturur veya var olan dosyayı açar ve içine `\"Hello, World!\"` yazdırır. Eğer dosya başarıyla açılırsa, yazma işlemi yapıldıktan sonra dosya kapatılır. Dosya açılamazsa, hata mesajı ekrana yazdırılır.\n\n---\n\n### ifstream ve ofstream ortak kullanım örneği\n\n```cpp\n#include \u003ciostream\u003e\n#include \u003cfstream\u003e\n#include \u003cstring\u003e\n\nint main(int ac, char **av)\n{\n    // Argüman sayısını kontrol et\n    if(ac != 4)\n    {\n        std::cout \u003c\u003c \"*** You must enter 4 arguments.\" \u003c\u003c std::endl ;\n        return 0;\n    }\n\n    // Girdi dosyasını aç\n    std::ifstream inputFile(av[1]);\n    // Dosyanın açılıp açılmadığını kontrol et\n    if(!inputFile)\n    {\n        std::cout \u003c\u003c \"*** Entered file cannot open.\" \u003c\u003c std::endl;\n        return 0;\n    }\n\n    // Aranacak ve değiştirilecek kelimeleri al\n    std::string s1 = av[2];\n    std::string s2 = av[3];\n\n    // Aranacak kelime ve değiştirilmiş kelimenin aynı olup olmadığını kontrol et\n    if(s1 == s2)\n    {\n        std::cout \u003c\u003c \"*** Are u kidding me? Please enter different word or letter.\" \u003c\u003c std::endl;\n        return 0;\n    }\n\n    // Dosya açıldıysa işlemlere başla\n    if(inputFile.is_open())\n    {\n        std::string line;\n        // Çıktı dosyasının adını belirle\n        std::string r_file = av[1];\n        r_file += \".replace\";\n        // Çıktı dosyasını aç\n        std::ofstream replace_file(r_file);\n\n        // Girdi dosyasını satır satır oku\n        while(std::getline(inputFile, line))\n        {\n            // Aranacak kelimeyi bul\n            size_t found = line.find(s1);\n            // Aranacak kelime bulunana kadar işlemi tekrarla\n            while(found != std::string::npos)\n            {\n                // Aranacak kelimeyi sil\n                line.erase(found, s1.length());\n                // Değiştirilen kelimeyi ekle\n                line.insert(found, s2);\n                // Bir sonraki arama için pozisyonu güncelle\n                found = line.find(s1);\n            }\n            // Değiştirilen satırı çıktı dosyasına yaz\n            replace_file \u003c\u003c line \u003c\u003c std::endl;\n        }\n        // Dosyaları kapat\n        replace_file.close();\n        inputFile.close();\n    }\n    return 0;\n}\n```\n\n**Açıklama:** Bu program, komut satırından üç argüman alarak bir dosya üzerinde metin değiştirme işlemi yapar.\n\n- **Argüman Sayısını Kontrol Etme:**\nProgram, dört argüman (program adı ve üç ek argüman) bekler. Argüman sayısı doğru değilse hata mesajı verir ve sonlanır.\n\n- **Dosya Açma:**\nGirdi dosyası `(av[1])` ifstream kullanılarak açılır. Dosya açılamazsa hata mesajı verilir ve program sonlanır.\n\n- **Aranacak ve Değiştirilecek Kelimeler:**\ns1 ve s2 isimli iki string değişken, ikinci `(av[2])` ve üçüncü `(av[3])` argümanlardan alınır. Bu iki kelime arasında eşitlik kontrolü yapılır; eğer aynı ise kullanıcıya hata mesajı verilir.\n\n- **Dosya Okuma ve Değişiklik Yapma:**\nGirdi dosyası açıldıysa, satır satır okunur. Her satırda `s1` kelimesi aranır. Bulunan tüm s1 kelimeleri, `s2` ile değiştirilir.\n\n- **Sonuçların Yazılması:**\nDeğiştirilen her satır yeni bir dosyaya `(\u003coriginal_filename\u003e.replace)` yazılır. Bu dosya, ofstream kullanılarak oluşturulur ve yazma işlemi tamamlandığında kapatılır.\n\n- **Dosya Kapatma:**\nGirdi ve çıktı dosyaları kapatılır.\n\n---\n\n\u003cp align=\"center\"\u003e2025 This project was created by Derya ACAR.\u003c/p\u003e\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fderyaxacar%2F42-cpp-module-01","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fderyaxacar%2F42-cpp-module-01","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fderyaxacar%2F42-cpp-module-01/lists"}