fstream (File Stream, Dosya Akışı)
Yazan : Şadi Evren ŞEKER
Özellikle C++ dilinde dosyalara erişmek ve dosyalar üzerinde işlem yapmak için çeşitli fonksiyonlardan oluşan bir kütüphanenin ismidir.
Aslında bilgisayarlardaki giriş çıkış işlemlerini ( I/O input/output) dört ana başlıkta toplamak mümkündür.
- Standart giriş çıkış işlemleri (klavye ve ekran) (Standard input output)
- Dosya giriş çıkış işlemleri (İşletim sisteminin dosya yapısındaki bir dosyadan okumak ve bu dosyaya yazmak şeklinde) (File input output)
- Hafıza giriş çıkış işlemleri (Hafızanın herhangi bir bölgesinden veya bazı durumlarda farklı işlemlerin (process) aralarında iletişimi için hafızadan okumak ve yazmak şeklindeki giriş çıkışlar (Memory input output)
- Ağ giriş çıkış işlemleri (Ağda bulunan başka bir bilgisyara belirlenmiş bir protokol çerçevesinde (Örneğin TCP/IP) ile veri göndermek ve almak şeklindeki giriş çıkış işlemleri) (Network input output)
Bu yazının amacı, dosyala giriş çıkış işlemlerini içeren fstream kütüphanesini tanıtmaktır.
Yine başlamadan önce bilinmesi gerekir ki dosyalar programlama dillerinde iki ana grup altında incelenebilir:
- Metin dosyaları (Text Files)
- İkili dosyalar (Binary Files)
Metin dosyalarını basitçe bir metin editörüyle açıp okuduğumuz (örneğin notepad, vi gibi) dosyalar olarak düşünebiliriz. Bu dosyalarda veri ardışık bir şekilde (sequential) dosyaya yazılmıştır. Dosyadaki herhangi bir veriye erişmek için dosyanın başından o veriye kadar ilerlemek gerekir.
İkili dosyalarda ise, dosyada bulunan verilere erişmeyi rastgele olarak yapabiliriz. Örneğin dosyanın 100. byte’ındaki bir veriye tek seferde erişilebilir. Ancak ikili dosyaların okunması ve yazılması metin dosyaları kadar basit değildir. Bu dosya tiplerinin kodlanma durumlarına göre özel editörler ile açılması gerekir. Örneğin herhangi bir ofis uygulaması ile (openoffice, microsoft office gibi) kaydettiğiniz bir dökümanı basit bir metin editörü ile açmayı deneyebilirsiniz. Dosya açıldığında sizin için anlamsız semboller belirecektir. Sembollerin bu şekilde belirmesinin sebebi aslında dosyada bulunan değerlere ASCII tablosundan birer karşılık aranmasından kaynaklanmaktadır. Oysaki bir ikili dosyadaki değerlerin ASCII karşılığı olması gerekmez.
Dosyalama işlemlerini içeren fstream kütüphanesini bu yazı kapsamında 4 grupta inceleyeceğiz.
- Dosyaların açılması
- Dosyaların kapatılması
- Dosyalardan okuma ve yazma işlemleri
- İlave fonksiyonlar
Dosyaların açılması
Dosyalar 3 farklı şekilde açılabilir:
- Okuma şeklinde (Reading Mode)
- Yazma şeklinde (Writing Mode)
- Ekleme şeklinde (Append Mode)
Basitçe okuma şeklinde açılan bir dosyadan sadece veri okunabilir. Yazma şeklindeki dosyalara veri yazılabilir ve dosyada daha önceden bulunan bütün veriler silinir (bir anlamda üzerine yazılmış olur). Ekleme şeklinde açılan dosyalarda ise mevcut veri saklanır ve yazılan veriler dosyanın sonuna ilave edilir.
Dosyaların iki farklı tutulma şekli bulunduğunu daha önce görmüştük. Aşağıda dosyaların bu tutulma şekillerine (ikili veya metin) ve yukarıdaki açılma şekillerine göre fstream kütüphanesinden hangi fonksiyonla açıldığını görmekteyiz:
| Metin Dosyaları | İkili Dosyalar | |
| Yazma Şekli
(Write mode) |
Yazmak için
ofstream out (”dosya.txt”); veya ofstream out; out.open(”dosya.txt”); |
Yazmak için
ofstream out (”dosya.txt”,ios::binary); veya ofstream out; out.open(”dosya.txt”, ios::binary); |
| Ekleme Şekli
(Append Mode) |
ofstream out(”dosya.txt”,ios::app);
veya ofstream out; out.open(”dosya.txt”, ios::app); |
ofstream out (”dosya.txt”,ios::app|ios::binary);
veya ofstream out; out.open(”dosya.txt”, ios::app | ios::binary); |
| Okuma Şekli
(Read Mode) |
ifstream in (”dosya.txt”);
veya ifstream in ; in.open(”dosya.txt”); |
ifstream in (”dosya.txt”, ios::binary);
veya ifstream in ; in.open(”dosya.txt”, ios::binary); |
Yukarıdaki tablodaki kod örnekleri kullanılarak bir dosya okuma, yazma veya ekleme şekillerinde açılabilir.
Dosyaların Kapatılması
Dosya işlemleri sırasında özellikle bir dosyaya veri yazıldıktan sonra dosyanın kapatılması çok önemlidir. Çünkü işletim sistemi bir dosyaya yazılacak olan verileri doğrudan yazmak yerine hafızada bekletebilir. Bunun sebebi dosyaya yazılacak veriler üzerinde ileride bir değişiklik olma ihtimali ve bu durumda dosyaya erişmeden hafıza üzerinden ilgili değişikliğin yapılmasıdır.
Ancak dosya kapatıldığı zaman, programımızda dosyaya yazılmasını istediğimiz şeylerin tamamının dosyaya yazılmış olduğundan emin olabiliriz. Aksi halde yukarıda bahsedilen durum gibi dosyaya yazılması beklenen herşey yazılmış olmayabilir.
fstream kütüphanesinde dosyaların kapatılması için close() fonksiyonu bulunur. Bir dosyanın hangi şekilde açıldığına bakılmaksızın (ekleme, yazma veya okuma) ve dosyanın tipine bakılmaksızın (metin veya ikili dosya) bu fonksiyon kullanılabilir.
in.close();
veya out.close();
şeklinde dosya kapatılabilir.
Dosyalardan okuma ve yazma işlemleri
| Veri Tipi | Okuma fonksiyonları | Yazma fonksiyonları |
| char | get(); | put(); |
| Kelime (boşluğa, dosya sonuna yada satır sonuna kadar) | >> (yönlendirme operatörü) | << (yönlendirme) |
| Satır (dosya sonuna yada satır sonuna kadar) | getline(); | << (yönlendirme) |
| Nesne (struct veya object tipinde) | read(); | write(); |
| İkili dosya tipleri için | Yukarıdakilerin aynısı | Yukarıdakilerin aynısı |
Yukarıdaki tablodan okunmak veya yazılmak istenen veri tipine göre bir fonksiyon seçilerek kullanılabilir.
İlave Fonksiyonlar
Aşağıda pekçok zaman dosya işlemlerini kolaylaştıran bazı fonksiyonlar ve kullanım açıklamaları verilmiştir.
| İşlem | Fonksiyon | Açıklama |
| Dosya sonunu kontrol | eof() | Dosyadan okuma yapılırken dosyanın sonuna gelindiğinde true veya 1 değeri döndürür. |
| Herhangi bir işlemin hatalı olması. | bad() | Yazma veya okuma işlemleri sırasında bir işlemin herhangi bir sebeple gerçekleştirilememesi durumunda true veya 1 döndürür. |
| Dosya açık mı kontrolü | is_open() | Dosyanın açık olup olmadığını kontrol eder. Şayet açıksa true değilse false döndürür. |
| Okunan verinin miktarı | gcount(); | Dosya açıldıktan sonra şimdiye kadar dosyadan okunmuş olan verinin byte cinsinden değerini döndürür. |
| Karakter atlatma | igonore() | Verilen miktar kadar karakteri atlayarak sonrasından devam eder. Dosyadan okuma işlemi yapılırken belirli bir bilgiyi atlamak için kullanılabilir. |
| Sıradaki karakteri kontrol | peek(); | Sıradaki karakteri kontrol eder ama dosyada ilerlemez. Yani dosyadan okuma işlemi yapıldığında kalınan yerden devam eder ama peek fonksiyonu ile sıradaki karakter kontrol edilebilir. |
| Rastgele erişim (sadece ikili dosyalarda) | seekg();
seekp(); tellg(); tellp(); |
Fonksiyonların sonu g ile bitenler get (Almak) sonu p ile bitenler ise put(Atamak) için kullanılır. Basitçe dosyanın belirli bir konumuna gitmek veya mevcut konumunu öğrenmek için kullanılırlar. |
« CPU Utilization (MİB Meşguliyeti) | Şablonlar (Templates) »
Yorumlar
Bilgisayar Kavramları üzerinde şu anda okumakta olduğunuz 'fstream (File Stream, Dosya Akışı)' isimli yazı 20 Apr 2009 tarihinde, saat: 00:38 'de Şadi Evren ŞEKER tarafından gönderilmiş, toplam 1493 defa okunmuştur.
Benzer yazıları C/C++, Dosya Organizasyonu (File Organisation) kategorilerinden okuyabilirsiniz. Yazar ile irtibat kurmak için email gönderebilirsiniz. Yazıya yorum yapabilir ya da yapılan yorumları RSS 2.0 ile takibe alabilirsiniz.
Yazarın Kitabı
Bu yazının yazarı Şadi Evren ŞEKER'in son çıkan kitabı "Programlama ve Veri Yapılarına giriş (C, C++ ve JAVA ile)" hakkında bilgi almak için Buraya tıklayabilirsiniz.
Eklenen Son Yazılar
- Visual Basic ile Gösterici (Pointer) Kullanımı
- Hasse Çizgeleri (Hasse Diagrams)
- Zeki Vekiller (Akıllı Ajanlar, Intelligent Agents, Zeki Etmenler )
- Integral Kriptoanalizi ( Toplam Tecessüsü , Integral Cryptoanalysis)
- Diferansiyel Kriptoanalizi ( Fark Tecessüsü , Differential Cryptoanalysis)
- Sierpinski Üçgeni (Sierpinski Triangle)
- C ile programlamaya giriş final sınavı çözümleri
- Çok Seviyeli Sıralar (Multi Level Queues)
- Çift Özetleme (Double Hashing)
- İkinci Dereceden Sondalama (Quadratic Probing)
Yapılan Son Yorumlar
- Şadi Evren ŞEKER: Null, NULL, nil veya null olarak...
- Fatih Kabakci: hocam merhabalar,...
- kara: Çok güzel anlatılmış gerçekten teşekkürler...
- Şadi Evren ŞEKER: Bahsettiğiniz şekil dönüşümü...
- Caner: Kullanıcıdan açı girdisi almıyorsanız...
- Furkan Yediyildiz: Algoritmanin mantigi cok güzel...
- havva: çok sağolun çok güzel açıklamalar var tşk...
- Şadi Evren ŞEKER: typedef komutu, bir yapıdan yeni bir...
- fatih kabakci: hocam ben structures ile ilgili bir sorum...
- Şadi Evren ŞEKER: evet, yukarıda açıklanan, herhangi...
- Abdurrahman ulusoy: fi açısından teta kadar döndürme...
- Şadi Evren ŞEKER: Hayır yok, bir noktanın, herhangi...
- Abdurrahman ulusoy: Bu durumda yukarıdaki formüllerin...
- Abdurrahman ulusoy: Merhaba hocam Üstteki mesajımda...
- mustafa ekmekcioğlu: merhaba şadi bey ben hacettepe...
- Şadi Evren ŞEKER: Talebiniz üzerine...
- Evren Kocaturk: ve bunu matlab üzerinde, gerekli...
- Evren Kocaturk: teşekkürler, işime yarayacak gibi,...
- tuncay çavuşoğlu: Şadi bey teşekkürler.Kısa ve...
- attila: hocam bunun bir örneginide Visual Basic diliyle...
Yakın Yazılar
fstream (File Stream, Dosya Akışı)
FTP (File Transfer Protocol)(Dosya Transferi Protokolü)
JAR (JAVA Archive, JAVA Arşivi)
İstisna Yakalama (kabz-ı istisna, Exception Handling)
Veri Tabanı Yönetim Sistemleri (Database Management Systems, DBMS) Ş
Yığın İş ( Batch Job, Batch Process )
JAVA ile Sohbet İstemci/Sunucusu
Akış Şifrelemesi (Stream Cipher)
peer to peer (uçtan uca iletişim)
RC4 Şifrelemesi (RC4 Cipher, ARC4, ARCFOUR)
Sertifika Zincirleri (Certificate Chains)
HTML (Hyper Text Markup Language)
Bağlantılar
java için dosyadan kelime okuma işleminde
örneğin dosyada geçen “data” sayısının bulunmasında nasıl bir yol izlemek gerekir yardımcı olabilir misiniz ?
Basitçe string matching algoritmalarından birisini kullanabilirsiniz. İki dizginin (String) eşlenmesi (matching) için aşağıdaki yazıya bakmanızda fayda olabilir:
boyer moore dizgi arama algoritması
Bu yazıdaki eşleme algoritmalarını JAVA için uygularken bilmeniz gerekn tek şey iki dizginin eşit olup olmadığını karşılaştırmak için equals fonksiyonunu kullanmanız. Yine de yardımcı olmazsa lütfen burada belirtin ihtiyacınız doğrultusunda yardımcı olmaya çalışayım.
Yardımınız için çok teşekkür ederim yazdığınız algoritmayı programıma uyarladım.
sadi bey sizden başka yazan yok sizi tebrik ediyorum koca proflar doçentler yıllardır oturup bizim gibi bu konuların ancak adını duyan taşra üniversitesi öğrencilerine böyle bir sistem sunmadıkları gibi 10 yıldır bu dersi veren hala zahmet edip örenmeyenlere bilmeyenlere ne demeli.
takdir ve teşekkür