C Dosyaları G/Ç: Dosya Oluşturma, Açma, Okuma, Yazma ve Kapatma

⚡ Akıllı Özet

C dilinde dosya işleme, stdio kütüphanesi aracılığıyla kalıcı verileri diske kaydeder; bu kütüphane fopen ile dosya açar, fputc, fputs veya fprintf ile yazma, fgetc, fgets veya fscanf ile okuma ve fclose ile kapatma işlemlerini gerçekleştirir.

  • 📁 Dosya modları: fopen fonksiyonuna iletilen mod dizesi (r, w, a, r+, w+ veya a+), dosyanın okunup okunmayacağına, üzerine yazılıp yazılmayacağına veya dosyaya ekleme yapılıp yapılmayacağına karar verir.
  • ✍️ Veriler yazılıyor: fputc tek bir karakter yazar, fputs bir dize yazar ve fprintf biçimlendirilmiş metni dosya işaretçisine yazar.
  • ???? Verileri okuma: fgetc bir karakteri okur, fgets bir satırı bir arabelleğe okur ve fscanf dosyadaki biçimlendirilmiş belirteçleri ayrıştırır.
  • 🔒 Dosyalar kapatılıyor: fclose komutu, arabelleğe alınmış verileri boşaltır ve dosyayı serbest bırakır; başarılı olursa 0, başarısız olursa EOF döndürür.
  • 🔁 Etkileşimli G/Ç: getc ve putc komutları, tek seferde tek bir karakteri işleyerek girdiyi doğrudan bir dosyaya aktarır ve tekrar dışarı aktarır.
  • 🤖 Yapay zeka yardımı: GitHub Copilot ve yapay zeka asistanları, fopen, fprintf ve fgets rutinlerini oluşturur ve eksik NULL kontrollerini veya kapatılmamış dosyaları işaretler.

C Dosyaları G/Ç

C Dosya yönetimi

Dosyalar, büyük miktarda kalıcı veriyi depolamak için kullanılabilir. Birçok diğer dil gibi 'C' de aşağıdaki dosya yönetimi özelliklerini sunar. fonksiyonlar,

  1. Bir dosyanın oluşturulması
  2. Dosya açma
  3. Bir dosyayı okuma
  4. Bir dosyaya yazma
  5. 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.
  • Dosya sistemde zaten mevcutsa, bu fonksiyon kullanılarak doğrudan açılır.

fp bir dosyadır. işaretçi Bu da tür dosyasını işaret eder.

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 Dosyayı ekleme modunda açın. 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 şu şekilde belirtilir: dizeleri Bu nedenle her zaman çift tırnak içine alınmaları gerekir.

Örneğin:

#include <stdio.h>
int main() {
FILE *fp;
fp  = fopen ("data.txt", "w");
}

Çıktı:

Dosya, kodunuzu kaydettiğiniz klasörde oluşturulur.

C programı çıktısında bir dosya oluşturun

Dosyanızı oluşturmak istediğiniz yolu belirtebilirsiniz

#include <stdio.h>
int main() {
FILE *fp;
fp  = fopen ("D://data.txt", "w");
}

C dizininde belirtilen yola sahip bir dosya oluşturun.

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);

Örneğin:

FILE *fp;
fp  = fopen ("data.txt", "r");
fclose (fp);

`fclose` fonksiyonu, argüman olarak bir dosya işaretçisi alır. Dosya işaretçisiyle ilişkili dosya, `fclose` fonksiyonu yardımıyla kapatılır. Kapatma işlemi başarılı olursa 0, dosya kapatma sırasında bir hata oluşursa EOF (dosya sonu) döndürür.

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, file_pointer): Bu fonksiyon, file_pointer tarafından işaret edilen dosyaya bir karakter yazar.
  • fputs(str, file_pointer): Belirtilen dosyaya bir dize yazar.
  • fprintf(file_pointer, str, variable_lists): Bu fonksiyon, file_pointer tarafından işaret edilen dosyaya bir dize yazdırır. Dize isteğe bağlı olarak biçim belirleyicileri ve variable_lists değişken 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ı:

C dilinde fputc() fonksiyonunun çıktısı

Yukarıdaki program, bir sonraki satır sembolü olan "\n" karakterine ulaşana kadar fputc_test.txt dosyasına tek bir karakter yazar; bu karakter, cümlenin başarıyla yazıldığını gösterir. İşlem, dizideki her karakteri alıp dosyaya yazmaktan ibarettir.

fputc_test.txt dosyasının içeriği C dilinde yazılmıştır.

  1. Yukarıdaki programda fputc_test.txt isimli dosyayı yazma modunda oluşturup açtık ve dosyaya yazılacak stringimizi deklare ettik.
  2. 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ı:

C dilinde fputs() fonksiyonunun çıktısı

C dilindeki fputs_test.txt dosyasının içeriği

  1. Yukarıdaki programda fputs_test.txt adlı bir dosyayı yazma modunda oluşturup açtık.
  2. fputs() fonksiyonunu kullanarak üç farklı dize yazarak bir yazma işlemi gerçekleştirdikten sonra
  3. 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ı:

C dilinde fprintf() fonksiyonunun çıktısı

fprintf_test.txt dosyasının içeriği C dilinde

  1. Yukarıdaki programda fprintf_test.txt adlı bir dosyayı yazma modunda oluşturduk ve açtık.
  2. 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(file_pointer): Dosya işaretçisi tarafından gösterilen dosyadan bir sonraki karakteri döndürür. Dosyanın sonuna ulaşıldığında, EOF (dosya sonu) sinyali gönderilir.
  • fgets(buffer, n, file_pointer): Dosyadan n-1 karakter okur ve bu dizeyi, sonuna NULL karakteri '\0' eklenmiş bir arabelleğe kaydeder.
  • fscanf(file_pointer, conversion_specifiers, variable_adresses): Verileri ayrıştırmak ve analiz etmek için kullanılır. Dosyadan karakterleri okur ve dönüştürme belirleyicilerini kullanarak girişi bir değişken işaretçileri listesi olan variable_adresses'e atar. Scanf'te olduğu gibi, fscanf'in de boşluk veya yeni satır karakteriyle 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

C dilinde dosyadan veri okuma çıktısı

  1. Yukarıdaki programda, daha önce fprintf() fonksiyonu kullanılarak yazılmış olan "fprintf_test.txt" adlı dosyayı açtık ve bu dosya "Learning C with" başlığını içermektedir. Guru99” dizesi. Bunu, satır satır okuyan ve arabellek boyutunun tüm satırı işleyebilecek kadar büyük olması gereken fgets() fonksiyonunu kullanarak okuyoruz.
  2. Dosya işaretçisini dosyanın başına geri döndürmek için dosyayı yeniden açıyoruz. Her kelimeyi ayrı ayrı işlemek için çeşitli dize değişkenleri oluşturuyoruz. Değişkenlerin içeriklerini görmek için yazdırıyoruz. fscanf() fonksiyonu esas olarak şu amaçla kullanılır:tracve bir dosyadan veri ayrıştırma.
  3. İş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
  4. 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ı:

C dilinde etkileşimli dosya okuma ve yazma çıktısı

C dilinde getc ve putc dosya işleme çıktıları

  1. Yukarıdaki programda demo adlı bir dosyayı yazma modunda oluşturduk ve açtık.
  2. Yazma işlemi gerçekleştirildikten sonra fclose işlevi kullanılarak dosya kapatılır.
  3. Ş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.
  4. Okuma işlemi gerçekleştirildikten sonra dosya fclose işlevi kullanılarak tekrar kapatılır.

SSS

Metin modu, yeni satır karakterlerini işletim sistemine uyacak şekilde çevirirken, "rb" veya "wb" ile açılan ikili mod, baytları tam olarak oldukları gibi yazar. Görüntüler, ses dosyaları veya tam bayt düzeninin korunması gereken herhangi bir veri için ikili modu kullanın.

`fopen` fonksiyonu, dosya açılamadığında (örneğin dosya eksik olduğunda, izin verilmediğinde veya disk dolu olduğunda) NULL değerini döndürür. Okuma veya yazma işleminden önce döndürülen işaretçiyi her zaman NULL ile karşılaştırın, aksi takdirde program geçersiz bir işaretçi kullanır ve genellikle çöker.

Yazma modu “w”, mevcut bir dosyayı kısaltır, yazmadan önce içeriğini siler ve dosya yoksa yeniden oluşturur. Ekleme modu “a”, mevcut verileri korur ve yeni içeriği sona ekler, böylece önceden depolanmış hiçbir şey kaybolmaz.

`fseek` komutu dosya işaretçisini `SEEK_SET`, `SEEK_CUR` veya `SEEK_END`'den ölçülen bir bayt uzaklığına taşır. `ftell` komutu işaretçinin geçerli bayt konumunu döndürür ve `rewind` komutu işaretçiyi dosyanın başına geri gönderir. Birlikte, sıralı okuma yerine rastgele erişim sağlarlar.

fgets tüm satırı okuyor, durping Yeni satırda veya n-1 karakterden sonra durur, bu nedenle arabellek boyutuna saygı duyar. fscanf biçimlendirilmiş, boşlukla ayrılmış belirteçleri okur ve kısa bir diziyi taşırabilir. Tam satırları güvenli bir şekilde okumak için fgets daha iyi bir seçimdir.

EOF, genellikle -1 olan ve dosyanın sonunu işaretleyen bir sabittir. getc, fgetc ve fscanf gibi okuma fonksiyonları, daha fazla veri kalmadığında EOF değerini döndürür; bu nedenle döngüler, okumayı durdurmak için sonuçlarını EOF ile karşılaştırır.

Evet. Yapay zekâ destekli bir kodlama asistanı, düz metin komut isteminden fopen, fprintf ve fgets rutinlerini oluşturabilir, her dosya modunu açıklayabilir ve eksik NULL kontrolü veya kapatılmamış dosya gibi hataları tespit edebilir. Yapay zekânın önerdiği koda güvenmeden önce her zaman derleyin ve test edin.

GitHub Yardımcı Pilotu Kısa bir yorum veya fonksiyon adından yola çıkarak eksiksiz fopen, fputs ve fscanf blokları öneren C dosya işleme kodu yazar. Genellikle eşleşen fclose çağrısını ve bir hata kontrolünü de ekler, ancak yine de oluşturulan mantığı gözden geçirmeniz gerekir.

Bu yazıyı şu şekilde özetleyin: