C dilinde dosya işlemleri ilgili sorum var?

  • Konuyu başlatan Konuyu başlatan mate9
  • Başlangıç tarihi Başlangıç tarihi

mate9

Öğrenci
Katılım
17 Mayıs 2017
Mesajlar
1
Reaksiyon puanı
1
Puanları
3
Yaş
27
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(){

FILE *fp;

char aranan_harf, temp_harf;
int harf_sayisi = 0;

printf("Aranan harf:");
scanf("%c",&aranan_harf);

if ((fp = fopen("deneme.txt", "r")) == NULL)
{
printf("Dosya açılamadı!\n");
exit(1);
}

while ((temp_harf = fgetc(fp)) != EOF)
{
if (temp_harf == aranan_harf)
{
printf("%c bulundu\n", aranan_harf);
harf_sayisi++;
}
}
printf("\nAradığınız harften dosyada %d adet bulunmaktadır.", harf_sayisi);
fclose(fp);
}





Arkadaşlar ben girilen harfden kaç adet olduğunu bulabiliyorum sadece. Ama ben dosya içerisinde ki bütün harflerin sayısını göstermek istiyorum. Yani görüntü şu şekilde olmalı çalıştırdığımda.
E harfinden 32 adet var.
B harfinden 20 adet var.
A harfinden 12 adet var.
....
...
...

Gibi gitmesini istiyorum ne yapabilirim acaba ? Bir de harfler hangisinde daha fazla ise o en üstte yazsın istiyorum. Bu konu da yardımcı olabilecek var mı acaba? Şimdiden teşekkür ederim...
 

sinan60

Öğrenci
Katılım
3 Eylül 2009
Mesajlar
81
Reaksiyon puanı
1
Puanları
8
Bu tarz sorunların çözümleri için stackoverflow.com gibi sitelerde arama yapabilirsin.
C - Character Count from a File

Sadece harfleri görüntülemek istiyorsan son for döngüsünü ascii aralıklarına göre sınırlayabilirsin.
Kodu denemedim ama büyük küçük harfleri ayrı ayrı yazması durumunda bunu engellemek için toupper() , tolower() fonk. kullanabilirsin. Kolay gelsin

Kod:
#include<stdio.h>
#include<stdlib.h>

int main() {
  /* a buffer to hold the count of characters 0,...,256; it is
   * initialized to zero on every element */
  int count[256] = { 0 };

  /* loop counter */
  int k;

  /* file handle --- in this case I am parsing this source code */
  FILE *fp = fopen("ccount.c", "r");

  /* a holder for each character (stored as int) */
  int c;

  /* for as long as we can get characters... */
  while((c=fgetc(fp))) {

    /* break if end of file */
    if(c == EOF) break;

    /* otherwise add one to the count of that particular character */
    count[c]+=1;
  }

  /* now print the results; only if the count is different from
   * zero */
  for(k=0; k<256; k++) {
    if(count[k] > 0) {
      printf("char %c: %d times\n", k, count[k]);
    }
  }
  /* close the file */
  fclose(fp);

  /* that's it */
  return 0;
}
 

mirinkirin

Doçent
Katılım
4 Temmuz 2016
Mesajlar
708
Reaksiyon puanı
358
Puanları
63
Burada c değişkenine bir değer ataması yapılırken true veya false olduğu nasıl anlaşılıyor? Teşekkürler.
Aslında orada herhangi bir true-false durumu söz konusu değil.
while((c=fgetc(fp)) != EOF) yazılsaydı true-false kontrolü olacaktı.
while mecburen sonsuz döngüye gireceği için de çıkması için end of file kontrolünü bir alt satırdaki if ile yapmış.
Overflow gibi sitelerdeki elemanlar genelde kodun güzel görünmesi için her şeyi bir paranteze sıkıştırmamayı tercih ediyorlar.
 

hydrox

Öğrenci
Katılım
20 Mayıs 2017
Mesajlar
1
Reaksiyon puanı
0
Puanları
1
Yaş
24
Aslında orada herhangi bir true-false durumu söz konusu değil.
while((c=fgetc(fp)) != EOF) yazılsaydı true-false kontrolü olacaktı.
while mecburen sonsuz döngüye gireceği için de çıkması için end of file kontrolünü bir alt satırdaki if ile yapmış.

Hayır. Döngüde bir karşılaştırma söz konusu var.
Dosyadan karakterleri aldıgı sürece herhangi bir sorunla karsılasırsa fgetc NULL degeri döndürür ve döngü durur.
"for as long as we can get characters..." ki adam acıklamasınıda vermis. mesela aynı döngü şu şekildede yazılır.
Kod:
  /* for as long as we can get characters... */
  while(1) {
    if((c=fgetc(fp))) {
         /* break if end of file */
         if(c == EOF) break;
    } else {
          break;
    }
    /* otherwise add one to the count of that particular character */
    count[c]+=1;
  }

Kod:
while((c=fgetc(fp)))
Şu şekil syntax lede yazınca herhangi bir kosul ifade edisiliste aslında sadece ifade yazıldıgında derleyıcı bunu "NULL degilse" seklinde anlıyor.
Kod:
while((c=fgetc(fp)) != NULL)
ile eşdeğerdir.
 
Son düzenleme:

mirinkirin

Doçent
Katılım
4 Temmuz 2016
Mesajlar
708
Reaksiyon puanı
358
Puanları
63
Hayır. Döngüde bir karşılaştırma söz konusu var.
Dosyadan karakterleri aldıgı sürece herhangi bir sorunla karsılasırsa fgetc NULL degeri döndürür ve döngü durur.
"for as long as we can get characters..." ki adam acıklamasınıda vermis. mesela aynı döngü şu şekildede yazılır.
Şu şekil syntax lede yazınca herhangi bir kosul ifade edisiliste aslında sadece ifade yazıldıgında derleyıcı bunu "NULL degilse" seklinde anlıyor.
Text dosyasının içinde nasıl bir null değeri bulmayı bekliyorsunuz ?
Ayrıca bu mantıkla sizin while(1) dediğiniz kodda da aslında bir karşılaştırma var mı diyeceğiz, sonuçta her türlü parantez içi değer kontrol ediliyor. Aynı döngü şu şekilde de yazılır dediğiniz kodda fazladan 1 karşılaştırma daha oluşturmuş oluyorsunuz while(1) diyerek, toplam 3 karşılaştırma var. Hâlbuki adamın kodunda 2 :)
 

arsenik

Rektör
Katılım
8 Ağustos 2009
Mesajlar
11,349
Reaksiyon puanı
242
Puanları
243
Şu şekil syntax lede yazınca herhangi bir kosul ifade edisiliste aslında sadece ifade yazıldıgında derleyıcı bunu "NULL degilse" seklinde anlıyor.
[KOD]while((c=fgetc(fp)) != NULL)[/KOD]ile eşdeğerdir.

Burada fgetc fonksiyonu null döndürebilme ihtimaline sahipse integer tipteki c değişkenine null ataması yapılabilir demek oluyor bu. Ki böyle bir durumda burada c değişkenine null atanamayacağı için patlamayacak mı bu durum?

===============

C library function - fgetc()

Ekleme: fp null gelirse fgetc hata veriyormuş. Ama fp null değilse ya karakteri okuyor ya da dosya sonunda EOF döndürüyormuş. Dolayısıyla fp'nin null gelmemesi gerek.
--- Gönderi Güncellendi ---
Kod:
#include <stdio.h>

int main ()
{
   FILE *fp;
   int c;
   int n = 0;
 
   fp = fopen("file.txt","r");
   if(fp == NULL)
   {
      perror("Error in opening file");
      return(-1);
   }
   do
   {
      c = fgetc(fp);
      if( feof(fp) )
      {
         break ;
      }
      printf("%c", c);
   }while(1);

   fclose(fp);
   return(0);
}

Çıktı

Error in opening file: No such file or directory
 
Üst