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.

  1. Dosyaların açılması
  2. Dosyaların kapatılması
  3. Dosyalardan okuma ve yazma işlemleri
  4. İlave fonksiyonlar

Dosyaların açılması

Dosyalar 3 farklı şekilde açılabilir:

  1. Okuma şeklinde (Reading Mode)
  2. Yazma şeklinde (Writing Mode)
  3. 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.

Yorumlar

  1. Can

    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 ?

  2. Şadi Evren ŞEKER Article Author

    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.

  3. muuhammed kaplan

    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

  4. emre

    merhabalar 5:0:3
    1:2:4 gibi burst,arrival time ve priority yi gostern sayıları c++da programa nası ekleyip okutabilirim..bu kodları y.txt gibi bi dosyaya yazdırıp degerleri okutmam lazım programa nası eklerim boyle biseyi yardımcı olursanız cok sewinirim..

  5. Şadi Evren ŞEKER Article Author

    C++ ile klasik olarak dosyaya nasıl yazırıyorsanız o şekilde yazırabilirsiniz. Örneği aşağıda vermeye çalışayım:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    
    #include <iostream>
    #include <fstream>
    using namespace std;
     
    int main () {
      int a , b , p ; // örnek olarak arrival, burst, priority olduğunu kabul edelim.
      a=1;b=2;p=4; // örnek olarak veriyorum kodunuz elbette farklı olacak.
      ofstream myfile;
      myfile.open ("y.txt"); // farklı dosya ise y.txt değiştirin
      myfile << a << ":" << b << ":" << p << endl ; // aralarına : koyup satır sonu için endl yapıyoruz.
      myfile.close();
      return 0;
    }

    Sonuçta dosyada
    1:2:4n
    şeklinde bir içerik olacaktır (buradaki n satır sonu olarak kullanılmıştır, notepad vs. ile açarsanız birşey göremezsiniz)

    umarım yardımcı olur

    başarılar

  6. emre

    cok tesekkur ederim..peki bisey daha sorabilirmiyim koddaki 1:2:4 gibi degerleri kullanıcının girmesini istiyorsak ve sonsuz deger alacak benim yaptıgım program,verdiginiz kodda nası bi degişiklik yapmam gerekir?

  7. deniz

    Merhaba;
    uzerinde ugrastigim bir program var. Iki tane .txt dosyasini karsilastirmak ve bir output dosyasi olusturmam gerekiyor. iki dosyanin arasinda unlem virgul veya bosluk gibi farklar var ve bu iki dosyanin satirlarini karsilastirip output dosyasina yazdirmam gerekiyor. iki dosyada da ayni numarali satirda ayni icerik varsa outputa satir numarasini yazdirip satiri yazdirmam gerek ve eger satirlar farkliysa bu satirlardan birini diger dosyanin tamaminda aramam ve eger esini bulursam 2 satir numarasini da yazdirip satiri yazmam gerek eger esi yoksa da eski dosyada ise "old" yazip satir numarasini yazip satiri yazmam gerek ve eger esi olmayan satir yeni dosyada ise "new" yazip satir numarasini yazip satiri yazmam gerek. satirlarin iki dosyada farkli yerlerde olma ihtimali yuksek cunku bu iki dosya da birer kod dosyasi ve biri otekinin modifiye edilmis hali. cogu seyi yapiyorum ama .tellg() ve .seekg() komutlarini kullandigim zaman cozemedigim satir atlama veya satirlarin basindan 5-6 karakter silme gibi hatalar olusuyor ve bu komutlari kullanmam gerek .clear() komutunu da eklemeyi denedim ama bir faydasi olmadi. bir satiri diger dosyanin tamaminda aramak icin cursor noktasini kaydetmem dosyanin basina donmem satirlari taramam ve islem tamamlaninca eski noktaya geri donmem gerek ve bunun icin tellg ve seekg yi kullanmam gerekiyor diye dusunuyorum bu komutlardan kaynaklanan satir atlama karakter atlama gibi hatalar olup olmayacagi hakkinda ve nasil cozebilecegim konusunda bilgi verirseniz sevinirim. tesekkurler

  8. Ahmet Bilgic

    Sadi hocam, Word dokumanindan yada text dosyasindan okurken Turkce karakter problemi cikiyor bunu nasil cozebilirim. Su kodu denedim ama yine bazi turkce karakterler cikmiyor

    BufferedReader in = new BufferedReader(
    new InputStreamReader(new FileInputStream("C:\Users\Public\Documents\myfile.txt"), "UTF8"));
    str=in.readLine();
    while(str!=null){
    System.out.println(str);
    str=in.readLine();
    }

    }

  9. Şadi Evren ŞEKER Article Author

    bir kaç ihtimal var. Dosyanın UTF8 olmaması veya ekranın desteklememesi.

    Ekran sorunu için bir IDE kullanmanızı tavsiye ederim. Örneğin netbeans ile çalışırken output ekranında Türkçe karakterler sorunsuz görülürken, aynı kodu windows için konsoldan çalıştırdığınızda karakter problemi olur.

    Dosya problemi için de gelişmiş bir editör kullanarak dosyayı açmanızı ve karakter kodlamasını (encoding) değiştirmenizi öneririm.

    Örneğin sıkça kullandığım ve ücretsiz bir yazılım olan notepad++ ile dosyayı açtıktan sonra encoding menüsü altında değişiklik yapılmalıdır.

    Son olarak bunlar işe yaramıyorsa, dizginin (String) karakter kodlamasını değiştirmeyi deneyebilirsiniz.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    
    try {
        byte[] utf8Bytes = original.getBytes("UTF8");
        byte[] defaultBytes = original.getBytes();
     
        String roundTrip = new String(utf8Bytes, "UTF8");
        System.out.println("roundTrip = " + roundTrip);
        System.out.println();
        printBytes(utf8Bytes, "utf8Bytes");
        System.out.println();
        printBytes(defaultBytes, "defaultBytes");
    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    }
  10. Şadi Evren ŞEKER Article Author

    Sorunuzu doğru anladıysam, bir dosyanın bir kısmını değiştirmek istiyorusnuz. Bütün dosyayı değiştirmek istiyorsanız, açarken dosyayı yazma şekli ile açmanız (write mode) yeterli ve üzerine yazar.

    Ancak benim anladığım gibi dosyanın geri kalanına müdahale etmeden sadece istenen bir kısmını değiştirmek istiyorsanız öncelikle rast gele erişilebilir bir dosya erişimine ihtiyacınız var. Örneğin JAVA dilinde RandomAccessFile ismi verilen bir sınıf bulunuyor.

    API bağlantısını aşağıda veriyorum:
    http://download.oracle.com/javase/1.5.0/docs/api/java/io/RandomAccessFile.html

    Aşağıdaki şekilde yazılan bir kodu ele alalım:

    File dosya = new File (dosyaadi);
    //Dosyaya okuma ve yazma haklari ile erişmek için rastgele erişilebilir açıyoruz
    RandomAccessFile accessor = new RandomAccessFile (dosya, "rws");
    int sondan = 26;
    long baslangic = accessor.length() - sondan;

    accessor.seek(baslangic);
    accessor.writeInt(x);
    accessor.writeShort(y);
    accessor.writeByte(z);
    accessor.close();

    Yukarıdaki kodda, dosyanın son 26 byte uzunluğundaki verisine doğrudan erişilim (random access) buraya bir integer, bir short ve bir byte tipinde 3 değişken değeri yazılmıştır. Bu bilgiler, eski verilerin üzerine yazılır. Elbette x,y ve z değişkenlerini önceden tanımlamanız gerekir.

    başarılar

  11. Şadi Evren ŞEKER Article Author

    o kodda, dosya ofstream ile açıldığı için, kodun çalıştığı dizinde oluşturulur. Yani dosya ilk kez oluşturulup içerisine veri yazıldığı için, dosyayı sizin derlediğiniz program diskte oluşturacaktır. Sizin ayrıca bir dosya oluşturmanız gerekmez. Dosyayı bulmaya çalışıyorsanız da, dosya programın çalıştığı dizin içerisindedir.

  12. ofrkk

    Merhabalar benim sorum seekg() ve tellg() ile ilgili olacak. Bir dosyayı açıp sonuna kadar okuduktan sonra kapatmadan tekrar baştan okumam gerekiyor. getpointer dosyanın sonuna işaret ediyorken

    infile.seek(0,ios::beg); yazıyorum ama dosyanın başını işaret etmiyor. Bu sorunu nasıl giderebilirim. Şimdiden teşekkürler

  13. Şadi Evren ŞEKER Article Author

    sanırım istream kütüphanesini (C++) kullanıyorsunuz. Burada seek fonksiyonu yerine seekg fonksiyonu vardır ve aşağıdaki şekilde kullanılabilir:

    1
    2
    
      is.seekg (0, ios::end); // dosyanın sonuna gider
      is.seekg (0, ios::beg); // dosyanın başına gider

    bu kullanımda yer verilen ikinci parametreler, offset verileridir ve aşağıdaki alternatiflerden birisi kullanılabilir:

    ios_base::beg Akışın başına döner
    ios_base::cur Akışın mevcut durumununun göstericisini ayarlar
    ios_base::end Akışın sonunun göstericisini ayarlar

    tellg fonksiyonu ise göstericinin (pointer) durumunu döndürür. Yani seekg göstericinin konumunu değiştirirken, tellg göstericinin konum bilgisini döndürür.

    seekg fonksiyonunun iki ayrı üzerine yüklenmiş hali vardır (overloaded)

    1
    2
    
    basic_istream<charT,traits> & seekg ( pos_type pos );
    basic_istream<charT,traits> & seekg ( off_type off, ios_base::seekdir dir );

    Şayet yukarıdakileri doğru bir şekilde uyguladıysanız, ki yorumunuzdan uygulamış olabileceğinizi çıkarıyorum, probleminiz, dosyanın açılması veya okunması sırasında da oluyor olabilir. Belki dosya işlemlerinizi içeren kodları tek başına bırakıp denemek ve yine çözülmüyorsa buradan yazmanız hatayı bulmamızı kolaylaştırabilir.

    Başarılar

  14. ofrkk

    Merhaba,
    Yazdığım kod şu şekilde,

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    
    #include 
    #include 
    #include 
     
    using namespace std;
     
    int main()
    {
    	int x,y,z;
    	ifstream in_file;
    	in_file.open("capacity.txt");
    	int matrix[12][3];
     
    	for(int i=0; i<12; i++)
    		for(int j=0; j> matrix[i][j];
     
    	for(int i=0; i<12; i++)
    	{		
    		for(int j=0; j<3; j++)
    			cout << matrix[i][j]<<" ";		
    		cout <> x >> y >> z;
    	cout << x <<" "<< y << " " << z;
     
    	system("pause");
    	return 0;
    }

    capacity.txt dosyasında,

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    
    1	2	10
    1	3	8
    1	5	5
    2	4	3
    2	6	5
    3	2	3
    3	4	10
    3	5	3
    4	6	8
    5	4	3
    5	6	10
    6	7	12

    verileri bulunmaktadır.
    Yazdığım koda göre bu 12 satırı yazdırıp tekrar ilk satırı yazdırması gerekiyor.

  15. Şadi Evren ŞEKER Article Author

    Kodunuz sanırım bozuk olarak çıkmış. For döngüsünde ve cout satırlarında hatalar var, büyük ihtimalle buraya yapıştırırken bozulmuş olabilir.
    Aslında site için büyük bir problem olan bu durumu düzeltmek için yeni bir eklenti ekledim. Buna göre kodunuzu aşağıdaki satır ile başlatabilir misiniz?

    1
    
    <pre line="1" colla="+">
  16. ofrkk
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    
    #include <iostream>
    #include <string>
    #include <fstream>
     
    using namespace std;
    int main()
    {
    	int x,y,z;
    	ifstream in_file;
    	in_file.open("capacity.txt");
    	int matrix[12][3];
     
    	for(int i=0; i<12; i++)
    		for(int j=0; j<3; j++)
    			in_file >> matrix[i][j];
     
    	for(int i=0; i<12; i++)
    	{		
    		for(int j=0; j<3; j++)
    			cout <<matrix[i][j]<<" ";		
    		cout << endl;	
    	}
    	in_file.seekg (0, ios::beg);
    	in_file >> x >> y >> z;
    	cout << x <<" "<< y <<" "<< z;
     
    	system("pause");
    	return 0;
    }

    Düzeltildi

  17. Şadi Evren ŞEKER Article Author

    Benim bilgisayarımda sorunsuz çalışıyor (gnu c compiler kullanıyorum) ve system pause satırı sorunlu olduğu için sildim.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    
    #include <iostream>
    #include <string>
    #include <fstream>
     
    using namespace std;
    int main()
    {
            int x,y,z;
            ifstream in_file;
            in_file.open("capacity.txt");
            int matrix[12][3];
     
            for(int i=0; i<12; i++)
                    for(int j=0; j<3; j++)
                            in_file >> matrix[i][j];
     
            for(int i=0; i<12; i++)
            {
                    for(int j=0; j<3; j++)
                            cout <<matrix[i][j]<<" ";
                    cout << endl;
            }
            in_file.seekg (0, ios::beg);
            in_file >> x >> y >> z;
            cout <<"sonsatir:>>"<< x <<" "<< y <<" "<< z;
     
            return 0;
    }

    Kodun çıktısı aşağıdaki şekilde:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    
    SADIs-MacBook-Air:~ sadievrenseker$ g++ dosyalama.cpp 
    SADIs-MacBook-Air:~ sadievrenseker$ ./a.out
    1 2 10 
    1 3 8 
    1 5 5 
    2 4 3 
    2 6 5 
    3 2 3 
    3 4 10 
    3 5 3 
    4 6 8 
    5 4 3 
    5 6 10 
    6 7 12 
    sonsatir:>>1 2 10SADIs-MacBook-Air:~ sadievrenseker$

    son satırında dosyanın başına dönüp tekrar bastırıyor.

    Başarılar

  18. ofrkk

    Ben visual studio 2010 kullanıyorum ve son satır için çöp değerler atıyor yani dosyanın başından okuma yapamıyor. Çok teşekkür ederim baya uğraştırdık.

  19. rıdvan
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    
    package ödev3soru3;
    import java.io.*;
    public class Ödev3soru3 {
     
     
        public static void main(String[] args) {
            StringBuffer icerik = new StringBuffer("");
            try{
     
               File f=new File("C:/Documents and Settings/ÇAKIR/Belgelerim/NetBeansProjects/ödev3soru3/src/ödev3soru3/dosya.txt");
               FileInputStream fi=new FileInputStream(f);
               int k;
     
               int rakam=0;
               int tkarakter=0;
                while ((k=fi.read())!=-1){
                    icerik.append((char)k);
     
     
                if(k=='1' || k=='2'|| k=='3'|| k=='4'|| k=='5'|| k=='6'|| k=='7'|| k=='8'|| k=='9'|| k=='0')
                {
                    rakam=rakam+1;
                }
                else if(k!='Ş')
                { tkarakter=tkarakter+1;
                }
     
            }
     
                System.out.println("rakam sayisi:"+rakam);
                System.out.println("türkçe karakter sayisi:"+tkarakter);}
            catch(FileNotFoundException f)
            {System.out.println("dosya yok");}
              catch(IOException ioex)
              {System.out.println("başka bir hata oldu"); }
     
               System.out.println("icerik :");
               String metin = String.valueOf(icerik);
               System.out.println(icerik);
        }
    }

    TXT DOSYASI İÇERİSİNDEKİ RAKAM VE TÜRKÇE KARAKTERLERİ BULAN BİR PROGRAM ÖDEVİM VAR FAKAT TÜRKÇE KARAKTERLER DÜZGÜN OKUNAMADIĞI İÇİN BUNLARIN SORGULAMASINI YAPAMIYORUM NE GİBİ DEĞİŞİKLİKLER YAPMALIYIM TEŞEKKÜRLER

  20. Ayşenur

    Merhaba hocam,

    ben dosyadaki double sayıyı data ya aktarmak istiyorum fakat sorun şu, benim sayım şöyle birşey : 1.5718649900000e+03 ama alırken sayıyı şu şekilde kaydediyor : 1571.861 bunu nasıl düzeltebilirim?

    double data;
    ifstream fin;
    fin.open("deneme2.txt");
    fin>>data;
    cout <<data;
    fin.close();

    Teşekkürler.

    1. Şadi Evren ŞEKERŞadi Evren ŞEKER

      Merhaba, sayıyı önce string okuyup daha sonra parse etmeyi deneyebilirsiniz. Sizin kodunuzdan gidecek olursak :

      ?View Code CSHARP
       
      String data;
      ifstream fin;
      fin.open("deneme2.txt");
      fin>>data;
      decimal d = Decimal.Parse(data, System.Globalization.NumberStyles.Float);
      cout <<d;
      fin.close();

      Kodu çalıştırmadım ama yukarıdaki şekliyle çalışması gerekir.

      Başarılar

  21. Burak Çelik

    Şadi hocam merhabalar.Benim de bir projem var sizden bir konuda yardım istiyorum. Elimde uzun bir text dosyası var. Bu text dosyasındaki kelimeleri teker teker ekrana yazdırmam gerekiyor.Fakat işin sıkıntılı tarafı şu ki,textteki noktalama işaretleri beni zor duruma sokuyor.

    int main(){

    fstream document;

    string line;

    document.open("Text.txt",ios::in);

    while (getline(document,line,' '))
    {
    cout<<line<<endl;
    }
    }
    burada boşluklarına göre ayırdım kelimeleri fakat noktalama işaretlerini atamıyorum.Yardımcı olursanız sevinirim.

  22. Canan Güngör

    Merhabalar, benim bir sorum olacaktı ben verilen input dosyasından \t karakterini silmek istiyorum nasıl yapabilirim?

    Teşekkürler.
    0 1 1 0 0
    0 0 1 1 1
    0 0 0 1 1
    0 0 0 0 1
    0 0 0 0 0
    8
    1 15
    5 10
    3 9
    4 5
    20
    2 3
    3 4
    4 5
    5 8
    9 10
    50
    10 60
    20 100
    30 120
    8
    4 9
    3 8
    5 10
    6 9
    2 3

  23. Canan Güngör

    bütün karakterlerin arasında \t karakteri var normalde ama burada yokmuş gibi göründü. Yani olmasını istediğim hali atmış oldum.

  24. Sinem

    bir ödevim var açık olan bir dosyadan veriyi alıp gerekli işlemlerden sonra başka bir dosyaya yazmasını istiyorum. Daha sonrasında yeni yazdığı dosyadaki verileri alıp bunlar üzerinde işlem yapmasını istiyorum ancak bu işlemi yapmak için verileri ilk açılmış olan dosyadan alıyor nasıl çözebilirim

  25. Nur

    Merhaba hocam.Metin editörü projem var ancak sadece C dilinde yazmamız istendi.Daha öncesinde paint projesini code blocks'a graphics.h kütüphanesini ekleyip projeyi C++ ile açıp C dilinde yazmıştım.(gereken C kütüphanelerini ekleyerek.) Çünkü graphics.h kütüphanesi C dilinde hata veriyordu. Peki metin editörü için hangi kütüphane ya da kütüphaneleri kullanabilirim?

Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir


4 − üç =