C Dosyaları G/Ç: Dosya Oluşturma, Açma, Okuma, Yazma ve Kapatma
C Dosya yönetimi
Bir Dosya, büyük miktarda kalıcı veriyi depolamak için kullanılabilir. Diğer birçok dil gibi 'C' de aşağıdaki dosya yönetim işlevlerini sağlar:
- Bir dosyanın oluşturulması
- Dosya açma
- Bir dosyayı okuma
- Bir dosyaya yazma
- Bir dosyayı kapatma
Aşağıda 'C'de mevcut en önemli dosya yönetim işlevleri listelenmiştir:
işlev | amaç | |
---|---|---|
fopen() | Dosya oluşturma veya mevcut bir dosyayı açma | |
fclose() | Bir dosyayı kapatma | |
fprintf() | Bir dosyaya veri bloğu yazma | |
fscanf () | Bir dosyadan blok verisinin okunması | |
getc () | Bir dosyadan tek bir karakter okur | |
putc () | Bir dosyaya tek bir karakter yazar | |
getw () | Bir dosyadan bir tam sayı okur | |
putw () | Bir dosyaya tamsayı yazma | |
fara () | Bir dosya işaretçisinin konumunu belirtilen konuma ayarlar | |
söyle () | Bir dosya işaretçisinin geçerli konumunu döndürür | |
geri sarma () | Dosya işaretçisini bir dosyanın başlangıcına ayarlar |
Dosya Nasıl Oluşturulur
Bir dosyayla çalışmak istediğinizde ilk adım bir dosya oluşturmaktır. Dosya, verilerin depolandığı bellekteki alandan başka bir şey değildir.
Bir 'C' programında dosya oluşturmak için aşağıdaki sözdizimi kullanılır:
FILE *fp; fp = fopen ("file_name", "mode");
Yukarıdaki sözdiziminde dosya, standart kütüphanede tanımlanan bir veri yapısıdır.
fopen, bir dosyayı açmak için kullanılan standart bir işlevdir.
- Eğer dosya sistemde yoksa oluşturulup açılır.
- Sistemde bir dosya zaten mevcutsa, bu kullanılarak doğrudan açılır. işlev.
fp, tür dosyasına işaret eden bir dosya işaretçisidir.
Bir dosyayı her açtığınızda veya oluşturduğunuzda, dosyayla ne yapacağınızı belirtmeniz gerekir. 'C' programlamada bir dosya okuma/yazma amaçları için oluşturulabilir veya açılabilir. Bir mod, bir dosyayı aşağıda verilen amaçlardan herhangi biri için açmak isteyip istemediğinizi belirtmek için kullanılır. Aşağıda, bir dosyayla çalışırken kullanılabilecek 'C' programlamadaki farklı mod türleri verilmiştir.
Dosya Modu | Açıklama |
---|---|
r | Okumak için bir dosya açın. Bir dosya okuma modundaysa, sistemde zaten bir dosya mevcutsa hiçbir veri silinmez. |
w | Yazmak için bir dosya açın. Bir dosya yazma modundaysa, dosya hiç mevcut değilse yeni bir dosya oluşturulur. Bir dosya sistemde zaten mevcutsa, dosyanın içindeki tüm veriler kesilir ve yazma amacıyla açılır. |
a | İçinde bir dosya aç ekleme modu. Bir dosya ekleme modundaysa dosya açılır. Dosyanın içeriği değişmez. |
r+ | baştan itibaren okumaya ve yazmaya açık |
w+ | okuma ve yazmaya açık, bir dosyanın üzerine yazılıyor |
a+ | Okumaya ve yazmaya açık, dosyaya ekleniyor |
Verilen sözdiziminde dosya adı ve mod dize olarak belirtildiğinden her zaman çift tırnak içine alınmaları gerekir.
Örnek:
#include <stdio.h> int main() { FILE *fp; fp = fopen ("data.txt", "w"); }
Çıktı:
Dosya, kodunuzu kaydettiğiniz klasörde oluşturulur.
Dosyanızı oluşturmak istediğiniz yolu belirtebilirsiniz
#include <stdio.h> int main() { FILE *fp; fp = fopen ("D://data.txt", "w"); }
Bir dosya nasıl kapatılır
Dosya üzerinde yapılan işlemler bittiğinde mutlaka dosya kapatılmalıdır. Bu, dosyanın içeriğinin ve bağlantılarının sonlandırıldığı anlamına gelir. Bu, dosyanın kazara hasar görmesini önler.
'C', dosya kapatma işlemini gerçekleştirmek için fclose işlevini sağlar. Fclose'un sözdizimi aşağıdaki gibidir,
fclose (file_pointer);
Örnek:
FILE *fp; fp = fopen ("data.txt", "r"); fclose (fp);
fclose işlevi argüman olarak bir dosya işaretçisini alır. Dosya işaretçisiyle ilişkili dosya daha sonra fclose işlevi yardımıyla kapatılır. Kapatma başarılıysa 0, dosya kapatılırken hata oluştuysa EOF (dosya sonu) değeri döner.
Dosyayı kapattıktan sonra aynı dosya işaretçisi diğer dosyalarla da kullanılabilir.
'C' programlamada program sonlandırıldığında dosyalar otomatik olarak kapanır. Bir dosyayı fclose işlevi yazarak manuel olarak kapatmak iyi bir programlama uygulamasıdır.
Dosyaya Yazmak
C'de, bir dosyaya yazarken '\n' yeni satır karakterlerinin açıkça eklenmesi gerekir.
Stdio kütüphanesi bir dosyaya yazmak için gerekli fonksiyonları sunar:
- fputc(char, dosya_işaretçisi): Dosya_işaretçisi ile gösterilen dosyaya bir karakter yazar.
- fputs(str, dosya_işaretçisi): Dosya_işaretçisi tarafından işaret edilen dosyaya bir dize yazar.
- fprintf(dosya_işaretçisi, str, değişken_listeleri): Dosya_işaretçisi tarafından işaret edilen dosyaya bir dize yazdırır. Dize isteğe bağlı olarak biçim belirticileri ve değişken_listeleri değişkenlerinin bir listesini içerebilir.
Aşağıdaki program bir dosyaya yazmanın nasıl gerçekleştirileceğini gösterir:
fputc() İşlev:
#include <stdio.h> int main() { int i; FILE * fptr; char fn[50]; char str[] = "Guru99 Rocks\n"; fptr = fopen("fputc_test.txt", "w"); // "w" defines "writing mode" for (i = 0; str[i] != '\n'; i++) { /* write to file using fputc() function */ fputc(str[i], fptr); } fclose(fptr); return 0; }
Çıktı:
Yukarıdaki program, içine tek bir karakter yazar. fputc_test.txt Cümlenin başarıyla yazıldığını gösteren bir sonraki satır sembolü “\n”ye ulaşana kadar dosya. İşlem, dizinin her karakterini alıp dosyaya yazmaktır.
- Yukarıdaki programda fputc_test.txt isimli dosyayı yazma modunda oluşturup açtık ve dosyaya yazılacak stringimizi deklare ettik.
- For döngüsünü kullanarak karakter karakter yazma işlemi yapıyoruz ve her karakteri “\n” karakteriyle karşılaşıncaya kadar dosyamıza koyuyoruz, ardından fclose fonksiyonu kullanılarak dosya kapatılıyor.
fputs () İşlev:
#include <stdio.h> int main() { FILE * fp; fp = fopen("fputs_test.txt", "w+"); fputs("This is Guru99 Tutorial on fputs,", fp); fputs("We don't need to use for loop\n", fp); fputs("Easier than fputc function\n", fp); fclose(fp); return (0); }
Çıktı:
- Yukarıdaki programda fputs_test.txt adlı bir dosyayı yazma modunda oluşturup açtık.
- fputs() fonksiyonunu kullanarak yazma işlemini yaptıktan sonra üç farklı yazı yazıyoruz. dizeleri
- Daha sonra fclose işlevi kullanılarak dosya kapatılır.
fprintf()İşlev:
#include <stdio.h> int main() { FILE *fptr; fptr = fopen("fprintf_test.txt", "w"); // "w" defines "writing mode" /* write to file */ fprintf(fptr, "Learning C with Guru99\n"); fclose(fptr); return 0; }
Çıktı:
- Yukarıdaki programda fprintf_test.txt adlı bir dosyayı yazma modunda oluşturduk ve açtık.
- fprintf() fonksiyonu kullanılarak bir string yazılarak yazma işlemi gerçekleştirildikten sonra fclose fonksiyonu kullanılarak dosya kapatılır.
Bir Dosyadan Veri Okumak
Bir dosyadan veri okumaya ayrılmış üç farklı işlev vardır
- fgetc(dosya_işaretçisi): Dosya işaretçisinin işaret ettiği dosyadaki bir sonraki karakteri döndürür. Dosyanın sonuna gelindiğinde EOF geri gönderilir.
- fgets(tampon, n, dosya_işaretçisi): Dosyadan n-1 karakter okur ve dizeyi, son karakter olarak NULL karakteri '\0' eklenen bir tamponda depolar.
- fscanf(dosya_işaretçisi, dönüşüm_belirleyicileri, değişken_adresleri): Verileri ayrıştırmak ve analiz etmek için kullanılır. Dosyadaki karakterleri okur ve girişi bir listeye atar. değişken işaretçiler değişken_adresler dönüşüm belirticilerini kullanır. Scanf'de olduğu gibi fscanf'ın da boşluk veya yeni satırla karşılaşıldığında dize okumayı durdurduğunu unutmayın.
Aşağıdaki program, fgets(), fscanf() ve fgetc() fonksiyonlarını kullanarak fputs_test.txt dosyasından okuma işlemini göstermektedir:
#include <stdio.h> int main() { FILE * file_pointer; char buffer[30], c; file_pointer = fopen("fprintf_test.txt", "r"); printf("----read a line----\n"); fgets(buffer, 50, file_pointer); printf("%s\n", buffer); printf("----read and parse data----\n"); file_pointer = fopen("fprintf_test.txt", "r"); //reset the pointer char str1[10], str2[2], str3[20], str4[2]; fscanf(file_pointer, "%s %s %s %s", str1, str2, str3, str4); printf("Read String1 |%s|\n", str1); printf("Read String2 |%s|\n", str2); printf("Read String3 |%s|\n", str3); printf("Read String4 |%s|\n", str4); printf("----read the entire file----\n"); file_pointer = fopen("fprintf_test.txt", "r"); //reset the pointer while ((c = getc(file_pointer)) != EOF) printf("%c", c); fclose(file_pointer); return 0; }
Sonuç:
----read a line---- Learning C with Guru99 ----read and parse data---- Read String1 |Learning| Read String2 |C| Read String3 |with| Read String4 |Guru99| ----read the entire file---- Learning C with Guru99
- Yukarıdaki programda, daha önce fprintf() fonksiyonu kullanılarak yazılmış olan ve “Learning C with Guru99” dizesini içeren “fprintf_test.txt” adlı dosyayı açtık. Bunu, tampon boyutunun tüm satırı işlemeye yetecek kadar olması gereken satır satır okuyan fgets() fonksiyonunu kullanarak okuduk.
- İşaretçi dosyasını dosyanın başlangıcını gösterecek şekilde sıfırlamak için dosyayı yeniden açıyoruz. Her kelimeyi ayrı ayrı ele almak için çeşitli dize değişkenleri oluşturun. İçeriklerini görmek için değişkenleri yazdırın. fscanf() esas olarak bir dosyadan veri ayıklamak ve ayrıştırmak için kullanılır.
- İşaretçi dosyasını dosyanın başlangıcını gösterecek şekilde sıfırlamak için dosyayı yeniden açın. Verileri okuyun ve EOF ifadesiyle karşılaşılıncaya kadar getc() işlevini kullanarak dosyadan karakter karakter yazdırın
- Farklı varyantlar kullanarak dosya okuma işlemi gerçekleştirdikten sonra dosyayı yine fclose fonksiyonunu kullanarak kapattık.
Getc ve putc ile Etkileşimli Dosya Okuma ve Yazma
Bunlar en basit dosya işlemleridir. Getc, get karakterini, putc ise put karakterini temsil eder. Bu iki işlev aynı anda yalnızca tek bir karakteri işlemek için kullanılır.
Aşağıdaki program 'C' programlamada dosya işleme fonksiyonlarını göstermektedir:
#include <stdio.h> int main() { FILE * fp; char c; printf("File Handling\n"); //open a file fp = fopen("demo.txt", "w"); //writing operation while ((c = getchar()) != EOF) { putc(c, fp); } //close file fclose(fp); printf("Data Entered:\n"); //reading fp = fopen("demo.txt", "r"); while ((c = getc(fp)) != EOF) { printf("%c", c); } fclose(fp); return 0; }
Çıktı:
- Yukarıdaki programda demo adlı bir dosyayı yazma modunda oluşturduk ve açtık.
- Yazma işlemi gerçekleştirildikten sonra fclose işlevi kullanılarak dosya kapatılır.
- Şimdi okuma modunda veri içeren bir dosyayı tekrar açtık. Eof bulunana kadar bir while döngüsü yürütülür. Dosyanın sonu bulunduğunda işlem sonlandırılacak ve veriler printf işlevi kullanılarak görüntülenecektir.
- Okuma işlemi gerçekleştirildikten sonra dosya fclose işlevi kullanılarak tekrar kapatılır.
ÖZET
- Dosya, verilerin saklandığı hafızadaki alandır.
- 'C' programlama, bir dosyayla ilgilenmek için çeşitli işlevler sağlar.
- Dosyalarla işlem yapma mekanizmasına dosya yönetimi denir.
- Üzerinde işlem yapılmadan önce bir dosyanın açılması gerekir.
- Bir dosya okuma, yazma veya ekleme modunda açılabilir.
- Getc ve putc fonksiyonları tek bir karakteri okumak ve yazmak için kullanılır.
- fscanf() işlevi bir dosyadaki verileri okumaya ve ayrıştırmaya izin verir
- Okuyabiliriz (kullanarak getc işlevi) EOF ile karşılaşılıncaya kadar tüm dosyayı kapsayacak şekilde döngü yaparak tüm dosyayı
- Fonksiyonu kullanarak bir dosyaya adını oluşturduktan sonra yazabiliriz. fprintf() ve dize metninin sonunda yeni satır karakteri bulunmalıdır.