Dosya İşlemleri

Dosya İşlemleri

C Programlama Dosya İşlemleri Başlık Görseli

    Değişkenler ve diziler içinde depolanan veriler geçicidir; bu türde veriler program sonlandığında kaybolurlar. Dosyalar, büyük miktarda veriyi kalıcı olarak tutmak için kullanılır.

Stream

     C, her dosyayı basit olarak bitlerin ard arda geldiği bir akış olarak görür. Her dosya ya dosya sonu belirteci (end-of-file) ya da sistemde yönetici veri yapısı tarafından belirlenmiş özel bir byte sayısı ile sonlanır. Standart giriş, standart çıkış ve standart hata stdin, stdout ve stderr göstericileri ile yönetilirler.

fgetc  ve getchar dosyadan bir karakter okur.

fgetc karakterin okunacağı dosyayı gösteren bir FILE gösterici alır. 

fgetc( stdin ) girişten bir karakter okur.

fputc yazdırılacak bir karakter ve yazılacağı dosyayı gösteren gösterici alır.

fputc(‘m’,stdout )  m karakterini stdout’ yazdırır. 

Sıralı Erişim Dosyası

Programcının bir dosyada kayıt yapısını kullanmasını aşağıdaki programla inceleyelim.

  1. #include <stdio.h>
  2. int main( )
  3. {
  4. int hesap;
  5. char isim[ 30 ];
  6. double bakiye;
  7. /* cfPtr = musteri.dat dosya göstericisi */
  8. FILE *cfPtr;
  9. /*fopen ile dosya açıldı ve dosya ismi verildi*/
  10. if ( ( cfPtr = fopen( "musteri.dat", "w" ) ) == NULL )
  11. printf( "Dosya acilamadi\n" );
  12. else
  13. {
  14. printf( "Hesap Numarasini, ismi ve bakiyeyi giriniz.\n" );
  15. printf( "EOF girerek veri girisini sonlandirin.\n" );
  16. printf( "? " );
  17. scanf( "%d%s%lf", &hesap, isim, &bakiye);
  18. /* Girişten bir karakter okur*/
  19. while ( !feof( stdin ) )
  20. {
  21. fprintf ( cfPtr, "%d %s %.2f\n",
  22. hesap, isim, bakiye );
  23. printf( "? " );
  24. scanf( "%d%s%lf", &hesap, isim, &bakiye);
  25. }
  26. /* Dosya kapatma*/
  27. fclose( cfPtr );
  28. }
  29. return 0;
  30. }
  31.  
Sıralı Erişim Dosyası
FILE*cfPtr; 

     cfPtr ,FILE yapısını gösteren göstericidir. 

if( ( cfPtr = fopen ( “ musteri . dat, ” w ” ) ) = = NULL )

     Dosyanın ismin vermektedir. musteri.dat 
cfptr
dosya göstericisi fopen açılan dosyadaki FILE yapısını gösteren gösterici.
fopen iki argüman alır “w” dosya açma ve dosya ismi musteri.dat.
fopen
sıfırdan dosya oluşturur. Var olan dosyaya yazmak için burada if yapısı vardır. if burada cfPtr göstericinin NULL olup olmadığına karar verir.   

while ( ! feof ( stdin ) )

     kodu, feof fonksiyonunu kullanarak stdin’in gösterdiği  dosyanın, dosya sonu belirtecinin elde edilip edilmediğine karar verir.

fclose
     Kullanıcı dosya sonu belirtecini girdikten sonra, program musteri.dat dosyasını fclose ile kapatır

r          Dosya okumak için açar.
w         Yazma için dosya oluşturur.
a          
Dosya sonuna ekleme yapar.
r+       Dosyayı güncelleme yapar.
w+      Güncelleme yapar ve içeriği siler.
a+       Dosya güncelleme yapar yazma işlemi dosya sonuna yapılır.

Dosyadan Veri Okumak

     Dosya oluşturup veri yazma işlemi bir önceki accordion anlatmıştık. Önceden oluşturulan dosyalarda veri okuma işlemini burada gerçekleştireceğiz.

if ( ( cfPtr = fopen ( “ musteri . dat, ” r ” ) ) = = NULL )

     Daha önce dosya oluşturma işlemi yaparken yukarıdaki kod satırında “r” yazılan yere “w” ifadesi yapmış ve dosya oluşturmuştuk, burada okuma işlemi yapacağımızdan “r” ifadesini kullandık.

  1. #include <stdio.h>
  2.  
  3. int main( )
  4. {
  5. int hesap;
  6. char ad[ 30 ];
  7. double bakiye;
  8. /* cfPtr = musteri.dat dosya göstericisi */
  9. FILE *cfPtr;
  10. /* Dosya açılmassa gönderilecek mesaj*/
  11. if ( ( cfPtr = fopen( "muster.dat", "r" ) ) == NULL )
  12. printf( "Dosya acilamadi\n" );
  13. else
  14. {
  15. printf( "%-10s%-13s%s\n", "Hesap", "isim", "Bakiye" );
  16. fscanf( cfPtr, "%d%s%lf", &hesap, ad, &bakiye);
  17. /* Sonuna kadar okuma işlemi*/
  18. while ( !feof( cfPtr ) )
  19. {
  20. printf( "%-10d%-13s%7.2f\n", hesap, ad, bakiye);
  21. fscanf( cfPtr, "%d%s%lf", &hesap, ad, &bakiye);
  22. }
  23. fclose( cfPtr );
  24. }
  25. return 0;
  26. }
fscanf( cfPtr, "%d%s%lf", &hesap, ad, &bakiye);

     16. kod satırındaki bu ifade bir dosya okur.

if ( ( cfPtr = fopen( “musteri.dat, “r” ) ) == NULL )

     11. kod satırındaki bu kodda dosya ismi değiştirirse çıktıda görüleceği gibi Dosya acilamadi yazar.

  1. #include <stdio.h>
  2.  
  3. int main( )
  4. {
  5. int secim, hesap;
  6. double bakiye;
  7. char isim[ 30 ];
  8. FILE *cfPtr;
  9.  
  10. if ( ( cfPtr = fopen( "musteri.dat", "r" ) ) == NULL )
  11. printf( "Dosya açılamadı\n" );
  12. else
  13. {
  14. printf( "Seciminiz : \n"
  15. " 1 - Sifir bakiyesi olan hesaplari listele \n"
  16. " 2 - Kredili hesaplarin listele \n"
  17. " 3 - Borcu olan hesaplari listele\n"
  18. " 4 - Cikis \n? " );
  19. scanf( "%d", &secim);
  20. while ( secim!= 4 )
  21. {
  22. fscanf( cfPtr, "%d%s%lf", &hesap, isim, &bakiye);
  23. switch ( secim )
  24. {
  25. case 1: printf( "\nSifir bakiyesi olan hesaplar:\n" );
  26. while ( !feof( cfPtr ) )
  27. {
  28. if ( bakiye == 0 )
  29. printf( "%-10d%-13s%7.2f\n",hesap, isim, bakiye);
  30. fscanf( cfPtr, "%d%s%lf",&hesap, isim, &bakiye);
  31. }break;
  32. case 2: printf( "\nKredili hesaplarin listesi:\n" );
  33. while ( !feof( cfPtr ) )
  34. {
  35. if ( bakiye < 0 )
  36. printf( "%-10d%-13s%7.2f\n",hesap, isim, bakiye);
  37. fscanf( cfPtr, "%d%s%lf",&hesap, isim, &bakiye);
  38. }break;
  39. case 3: printf( "\nBorcu olan hesaplar:\n" );
  40. while ( !feof( cfPtr ) )
  41. {
  42. if ( bakiye > 0 )
  43. printf( "%-10d%-13s%7.2f\n",hesap, isim, bakiye);
  44. fscanf( cfPtr, "%d%s%lf",&hesap, isim, &bakiye);
  45. }break;
  46. }
  47. rewind( cfPtr );
  48. printf( "\n? " );
  49. scanf( "%d", &secim);
  50. }
  51. printf( "Cikis\n" );
  52. fclose( cfPtr );
  53. }
  54. return 0;
  55. }
rewind ( cfPtr );

     47. satırda olan bu kod program çalışırken ard arda işler, yani programın dosya pozisyon göstericisini okuma yada yazma yapılacak bir sonraki byte numarasını belirtir. cfPtr ile gösterilen dosyanın başına ( 0.byte’a ) geri döner.

Dosyaya Veri Yazma

     fwrite  fonksiyonu, hafızada konumlanmış byte’ı dosyaya aktarır. Veriler dosyaya pozisyon göstericisi ile gösterilen konumdan itibaren yazılır.

fprintf ( fptr ,% d ” , sayi ) ;

     sayi değişkeninde 4 byte’ı fptr ile gösterilen dosyaya yazan;

fwrite ( &sayi , sizeof (int) , 1 , fPtr ) ;

ifadesi kullanıla bilir.

fread fonksiyonu, dosya içindeki pozisyon göstericisi ile belirlenen konumdan aldığı belli sayıdaki byte’ı belirlenen adresten başlayarak hafızaya aktarır.

  1. #include <stdio.h>
  2.  
  3. struct musteriVerisi
  4. {
  5. int hesapNo;
  6. char soyisim [ 15 ];
  7. char isim[ 10 ];
  8. double bakiye;
  9. };
  10. int main( )
  11. {
  12. int i;
  13. struct musteriVerisi bosVeri = { 0, "", "", 0.0 };
  14. FILE *cfPtr;
  15. if ( ( cfPtr = fopen( "kredi.dat", "w" ) ) == NULL )
  16. printf( "Dosya açılamadı\n" );
  17. else
  18. {
  19. for ( i = 1; i <= 100; i++ )
  20. fwrite( &bosVeri,sizeof ( struct musteriVerisi), 1, cfPtr );
  21. fclose ( cfPtr );
  22. }
  23. return 0;
  24. }

20. satırda yazılan aşağıdaki kodda

fwrite ( &bosVeri , sizeof ( struct musteriVerisi ) , 1 , cfPtr ) ;

    cfPtr ile gösterilen dosyaya sizeof ( struct musteriVerisi ) boyutundaki bosVeri yapısının yazdırılmasını sağlamaktadır.

Kimler Neler Demiş?

  Abone ol  
Bildir