[Çözüldü] C de Txt'ye veri yazdirma

Başlatan ZooM, 09 Ağustos 2010 - 20:14:51

« önceki - sonraki »

0 Üyeler ve 3 Ziyaretçi konuyu incelemekte.

ZooM


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

/*
*
*/
int main(int argc, char** argv) {
    FILE *DosyaOku;
    DosyaOku=fopen("/home/zoom/Masaüstü/ogrenci.txt","w");
    fputc('X', DosyaOku);

    return (EXIT_SUCCESS);
}


If I was your vampyre...

alquirel


ZooM

Alıntı yapılan: alquirel - 09 Ağustos 2010 - 20:17:48
fputs
fprintf

bu kodları dene
fputs tek karakter yazdiriyor. fprintf'e bakayim hemen
If I was your vampyre...

btermeli

DosyaOku=fopen("/home/zoom/Masaüstü/ogrenci.txt","w");

fprintf(DosyaOku,"%4d",X);

fclose(DosyaOku);
Duvarları olmayan bir dünyada, neden pencerelere ihtiyaç duyayım ki???

sem

Dosya içine X yazdırmak istiyorsanız kodunuzda sorun yok... Dosya yolunu kontrol edin...

EK: Uzantı bildirmeniz zorunlu değil...

Dosyayı "w" yerine "wt" olarak açarsanız text olarak bildirmiş olursunuz ya da varsayılan olarak zaten text olduğu için "w" yazınca da text algılanır... Kolay gelsin..
".NET çemberinden geçen lirisist etkisi bir 'Volcano', bir yüzüm Java bir yüzüm Badalamenti Don Tano"
----------------------------------------------------------------------------------------------------------------------
"Her yer ölüm yine, burası dünya
Derken ölüm bile bu nasıl dünya?
Benden ölüm dile, batıyor gün yine
Burası dünya?

alquirel

Alıntı yapılan: ZooM - 09 Ağustos 2010 - 20:18:57
Alıntı yapılan: alquirel - 09 Ağustos 2010 - 20:17:48
fputs
fprintf

bu kodları dene
fputs tek karakter yazdiriyor. fprintf'e bakayim hemen

fputc tek karakter yazar, fputs karakter dizisi yani string yazar

sem

alquirel'in dediği gibi fputs ile karakter dizisi yazdırırsınız... Sizin kodunuzda kullandığınız fputc tek karakter için kullanılır.... fprinf, fputs gibi kalıpları karakter dizisi ya da istediğiniz formatta şeyi yazırkam için kullanabilirsiniz...
#include <stdio.h>
#include <stdlib.h>

/*
*
*/
int main(int argc, char** argv) {
    FILE *DosyaOku;
    if((DosyaOku=fopen("/home/zoom/Masaüstü/ogrenci.txt","w")) == NULL)
    {
       fprintf(stdout,"Dosya acilamadi...\n");
       exit(EXIT_FAILURE);
    }
    fputc('X', DosyaOku);

    return (EXIT_SUCCESS);
}




Şeklinde dener misiniz? İlk kodunuzda sorun olmaması lazım... Tek sorun dosya yolu olabilir gibi duruyor... Şu şekilde deneyip görebilirsiniz...
".NET çemberinden geçen lirisist etkisi bir 'Volcano', bir yüzüm Java bir yüzüm Badalamenti Don Tano"
----------------------------------------------------------------------------------------------------------------------
"Her yer ölüm yine, burası dünya
Derken ölüm bile bu nasıl dünya?
Benden ölüm dile, batıyor gün yine
Burası dünya?

ZooM

Alıntı yapılan: sem0900 - 09 Ağustos 2010 - 20:27:59
alquirel'in dediği gibi fputs ile karakter dizisi yazdırırsınız... Sizin kodunuzda kullandığınız fputc tek karakter için kullanılır.... fprinf, fputs gibi kalıpları karakter dizisi ya da istediğiniz formatta şeyi yazırkam için kullanabilirsiniz...
#include <stdio.h>
#include <stdlib.h>

/*
*
*/
int main(int argc, char** argv) {
    FILE *DosyaOku;
    if((DosyaOku=fopen("/home/zoom/Masaüstü/ogrenci.txt","w")) == NULL)
    {
       fprintf(stdout,"Dosya acilamadi...\n");
       exit(EXIT_FAILURE);
    }
    fputc('X', DosyaOku);

    return (EXIT_SUCCESS);
}




Şeklinde dener misiniz? İlk kodunuzda sorun olmaması lazım... Tek sorun dosya yolu olabilir gibi duruyor... Şu şekilde deneyip görebilirsiniz...

hayir tek karakter olarak yazdirabilyorum orda sorun yok... Uzun bir cumle yazdirmak istedigimde nasil yapacagim onu merak ettim...

Mesela ;
Aytug AVCI - Elektrik - 2 seklinde yazdirmak istiyorum
If I was your vampyre...

sem

Pardon ben kodda sorun var gibi düşündüm anlamadım... Özür dilerim...


fprintf(DosyaOku,"Buraya ekrana yazdırır gibi yazdırabilirsiniz dosyaya");

Mesela;

fprintf(DosyaOku,"Aytug AVCI - Elektrik - 2 ");


Başka bir yol;

char dizi [] = "Aytug AVCI - Elektrik - 2 ";
fputs(dizi, DosyaOku);
".NET çemberinden geçen lirisist etkisi bir 'Volcano', bir yüzüm Java bir yüzüm Badalamenti Don Tano"
----------------------------------------------------------------------------------------------------------------------
"Her yer ölüm yine, burası dünya
Derken ölüm bile bu nasıl dünya?
Benden ölüm dile, batıyor gün yine
Burası dünya?

ZooM

evet simdi oldu :)
evet simdi oldu :) peki scanff ile nasil yapabilrim?  her ekledigim bir alt satirina eklicek

If I was your vampyre...

sem

fscanf'i ile dosyaya yazdıramazsınız okuma yapabilirsiniz. Normal klavyeden nasıl okuma yaptırıyorsanız scanf ile fscanf ile dosyadan okuma yapabilirsiniz. Yalnız scanf fonksiyonlarının hepsi (sscanf, fscanf, scanf...) boşluk karakterine kadar okuma yapabilirler... Mesela dosyanızdan yazdığınız aynısını okumak için;

fscanf(DosyaOku,"%s", dizi);

Derseniz eğer, ilk boşluğa kadar okuyacaktır. Yani "dizi" içersine sadece "Aytug" alınır. Siz dosyadan okuma mı yapmak istiyorsunuz, dosyaya tekrardan yazı yazdırmak mı istiyorsunuz?
".NET çemberinden geçen lirisist etkisi bir 'Volcano', bir yüzüm Java bir yüzüm Badalamenti Don Tano"
----------------------------------------------------------------------------------------------------------------------
"Her yer ölüm yine, burası dünya
Derken ölüm bile bu nasıl dünya?
Benden ölüm dile, batıyor gün yine
Burası dünya?

ZooM

Alıntı yapılan: sem0900 - 09 Ağustos 2010 - 20:47:00
fscanf'i ile dosyaya yazdıramazsınız okuma yapabilirsiniz. Normal klavyeden nasıl okuma yaptırıyorsanız scanf ile fscanf ile dosyadan okuma yapabilirsiniz. Yalnız scanf fonksiyonlarının hepsi (sscanf, fscanf, scanf...) boşluk karakterine kadar okuma yapabilirler... Mesela dosyanızdan yazdığınız aynısını okumak için;

fscanf(DosyaOku,"%s", dizi);

Derseniz eğer, ilk boşluğa kadar okuyacaktır. Yani "dizi" içersine sadece "Aytug" alınır. Siz dosyadan okuma mı yapmak istiyorsunuz, dosyaya tekrardan yazı yazdırmak mı istiyorsunuz?

şöyle aciklama calisayim... boyle bir kod yazdim calismadi... umarim kod ile anlatabilmisimdir :)

/*
* File:   main.c
* Author: zoom
*
* Created on 09 Ağustos 2010 Pazartesi, 19:27
*/

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

/*
*
*/
int main(int argc, char** argv) {
    int adi, soyadi, bolumu, sinifi;
    FILE *DosyaOku;
    DosyaOku = fopen("/home/zoom/Masaüstü/ogrenci.txt", "w");
    printf("Ogrenci kayit programina hosgeldiniz\n");
    printf("Ogrencinin adini giriniz\n");
    scanf("%s",adi);
    printf("Ogrencinin soyadini giriniz\n");
    scanf("%s",soyadi);
        printf("Ogrencinin bolumunu giriniz\n");
    scanf("%s",bolumu);
        printf("Ogrencinin sinifini(rakamla) giriniz\n");
    scanf("%d",sinifi);
    fprintf(DosyaOku,"adi soyadi bolumu sinifi \n");

    return (EXIT_SUCCESS);
}

If I was your vampyre...

sem

Bakın gördüğüm ilk şeyi belirtmek isterim... Bu kodda hata almanız çok normal... adi ve soyadi gibi bilgiler int olarak tanıtılmış ama %s olarak çekiliyor. int dediğiniz zaman sadece tam sayı tutabilirsniz. %s ile scanf'ten çekerseniz de karakter dizisi çekeceğiniz anlamına gelir. Bu durumda hata alacaksınız... isim, soy isim gibi karakter dizilerini char isim [20] gibi yapmanız lazım...  Onun dışında scanf fonkisyonu adrese atama yapar. isim karakter dizisi olarak tanıtılırsa adres belirteceği için sorun olmaz ama bir int sayıyı scanf ile çekmek için & operatörünü kullanmanız gerekir umarım ben anlatabilmişimdir =)

Bir de mesela printf içerisine ne yazarsanız aynen ekrana ya da dosyaya basılır. Onun içinde ayrı karakter var, özel karakterler

pritntf(DosyaOku,"%s %s %s", adi, soyadi, bolumu);

burada %s'ler sıraası ile virgülden sonraki değişkenler ile eşleştirilir.
".NET çemberinden geçen lirisist etkisi bir 'Volcano', bir yüzüm Java bir yüzüm Badalamenti Don Tano"
----------------------------------------------------------------------------------------------------------------------
"Her yer ölüm yine, burası dünya
Derken ölüm bile bu nasıl dünya?
Benden ölüm dile, batıyor gün yine
Burası dünya?

alquirel

dosyaya yazarken de şu kodu kullan

fprintf(DosyaOku,"%s %s %s %s\n",adi,soyadi,bolumu,sinifi);

sem

Ben ek yaparken alquirel yazmış zaten...

Bu ay Aybars'ın yazısını okumanızı öneriyorum =) SUDO dergisinde
".NET çemberinden geçen lirisist etkisi bir 'Volcano', bir yüzüm Java bir yüzüm Badalamenti Don Tano"
----------------------------------------------------------------------------------------------------------------------
"Her yer ölüm yine, burası dünya
Derken ölüm bile bu nasıl dünya?
Benden ölüm dile, batıyor gün yine
Burası dünya?

ZooM

oncelikle sudo yu bi okuyalim ozaman :) bu ayki derken temmuzda cikan mi agustosda cikacak olan mi :)
If I was your vampyre...

sem

Bu ay dergimiz çıkmadı daha, bunu saymayız 15'inde yine bekleriz =)

Şakası bir yana ama türler ile ilgili olarak biraz daha geniş bilgiye sahip olabilirsiniz...
".NET çemberinden geçen lirisist etkisi bir 'Volcano', bir yüzüm Java bir yüzüm Badalamenti Don Tano"
----------------------------------------------------------------------------------------------------------------------
"Her yer ölüm yine, burası dünya
Derken ölüm bile bu nasıl dünya?
Benden ölüm dile, batıyor gün yine
Burası dünya?

ZooM

Tür derken :) C'ye baslayali bi kac gn oldu pek anlamiyorum anlamak icin ugrasiyorum :)
Kodu duzelttim oldu gibi ama yinede ufak bi sorun var :)

kodcuk bu :
Alıntı Yap/*
* File:   main.c
* Author: zoom
*
* Created on 09 Ağustos 2010 Pazartesi, 19:27
*/

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

/*
*
*/
int main(int argc, char** argv) {
    char adi[20];
    char soyadi[20];
    char bolumu[20];
    char sinifi[20];

    FILE *DosyaOku;
    DosyaOku = fopen("/home/zoom/Masaüstü/ogrenci.txt", "w");
    printf("Ogrenci kayit programina hosgeldiniz\n");
    printf("Ogrencinin adini giriniz\n");
    scanf("%s", adi);
    printf("Ogrencinin soyadini giriniz\n");
    scanf("%s", soyadi);
    printf("Ogrencinin bolumunu giriniz\n");
    scanf("%s", bolumu);
    printf("Ogrencinin sinifini(rakamla) giriniz\n");
    scanf("%d", sinifi);
    fprintf(DosyaOku, "%s %s %s %s\n", adi, soyadi, bolumu, sinifi);

    return (EXIT_SUCCESS);
}


buda ogrenci.txt ciktisi.

Alıntı Yapaytug avci elektrik 
2 rakamini yazdiramiyorum. birde her yazdigimi uzerine yaziyor alt alta yazdirmak icin nasil bisiler eklemeliyim?
If I was your vampyre...

sem

2 yi direk printf içine ekleyebilirsiniz.

fprintf(DosyaOku,"aytug avci elektrik -2"); ya da nereye yazdırmak isterseniz o printf'in için mesela;

fprintf(DosyaOku, "%s %s %s %s - 2\n", adi, soyadi, bolumu, sinifi); olarak tırnakların içine ekleyebilirsiniz. w modunda açıyorsunuz dosyayı. Bunun anlamı dosya varsa içeriğini silip aç, yoksa yarat. Eğer var olan dosyayının içerdiğini kullanmak istiyorsanız a ile açmalınısız.

DosyaOku = fopen("/home/zoom/Masaüstü/ogrenci.txt", "at"); komutu ile deneyin... Ya da aşağıdaki ile, ikisi aynı şeyi ifade edecektir

DosyaOku = fopen("/home/zoom/Masaüstü/ogrenci.txt", "a");
".NET çemberinden geçen lirisist etkisi bir 'Volcano', bir yüzüm Java bir yüzüm Badalamenti Don Tano"
----------------------------------------------------------------------------------------------------------------------
"Her yer ölüm yine, burası dünya
Derken ölüm bile bu nasıl dünya?
Benden ölüm dile, batıyor gün yine
Burası dünya?

ZooM

Alıntı yapılan: sem0900 - 09 Ağustos 2010 - 22:00:12
2 yi direk printf içine ekleyebilirsiniz.

fprintf(DosyaOku,"aytug avci elektrik -2"); ya da nereye yazdırmak isterseniz o printf'in için mesela;

fprintf(DosyaOku, "%s %s %s %s - 2\n", adi, soyadi, bolumu, sinifi); olarak tırnakların içine ekleyebilirsiniz. w modunda açıyorsunuz dosyayı. Bunun anlamı dosya varsa içeriğini silip aç, yoksa yarat. Eğer var olan dosyayının içerdiğini kullanmak istiyorsanız a ile açmalınısız.

DosyaOku = fopen("/home/zoom/Masaüstü/ogrenci.txt", "at"); komutu ile deneyin... Ya da aşağıdaki ile, ikisi aynı şeyi ifade edecektir

DosyaOku = fopen("/home/zoom/Masaüstü/ogrenci.txt", "a");
tamam "a t" paramatrelerini denerim simdi... ama scanf f ile kayit yaptiracagim icin surek li 2. sinif ogrencileri kayit edilmeyecek 1. sinif yada 3. sinif da olacak :)
If I was your vampyre...

sem

O zaman örneğin kaçıncı sınıf olduğunu tutan bir parametre daha tanımlayıp örneğin bu paramtreye kac_sinif diyelim;

kac_sinif = 3;

fprintf(DosyaOku,"%d",kac_sinif);

şeklinde istediğiniz yere yazdırabilirsiniz. Karakter dizileri %s ile integer sayılar yani int %d ile char %c ile float %f ile gibi printf içinde değişkenlerinizi tanımlayabilirsiniz.  Ayrıca bu şekilde sabit olmaz istediğiniz değeri atarsınız... Yanlış mı anladım soruyu?
".NET çemberinden geçen lirisist etkisi bir 'Volcano', bir yüzüm Java bir yüzüm Badalamenti Don Tano"
----------------------------------------------------------------------------------------------------------------------
"Her yer ölüm yine, burası dünya
Derken ölüm bile bu nasıl dünya?
Benden ölüm dile, batıyor gün yine
Burası dünya?

alquirel

bence senin aklını bu cevaplarla daha fazla karıştırmadan bu integer char falan nedir, %s %d ne işe yarar printf scanf ne yapar güzel bi dökümandan okuman lazım

aslında bi döküman bulup adresini vermeyi düşünüyordum ama madem aybars arkadaşımız uğraşmış emek boşa gitmesin :)

ZooM

tam olarak kodun icinde nasil yapacagimi anlamadim. Soyle anlatayim scanf ile girdigim degeri yazdircak. ustteki kodda yazdigim parametreleri yan yana ekliyor ama en sonda sinifi ekle dedigimde ekleyemiyorum. garip bi yer cikiyor.
If I was your vampyre...

alquirel

o hatanın nedeni sınıf değişkenini char olarak tanımlayıp %d yani integer belirteci ile okumaya çalışman

iki seçeneğin var

ya yine char olarak tanımlamaya devam edip onu da diğerleri gibi %s ile okuyacaksın
ya da onu sem0900 ün dediği gibi integer olarak tanımlayıp %d ile okuyacaksın

tabii seçtiğin seçeneğe göre en sonki printf işlevinin içini de %s ya da %d yapacaksın

son bir fark %s ile okuma yaparken scanf de & işaretini kullanmıyorsun
%d ile okuma yaparken değişken isminin başına & işaretini koyuyorsun

sem

#24
ZooM, biraz hızlı ilerlemişsiniz siz. Çünkü tür bilgisi olmadan normal yani klavye ve ekrandan okuma yazma yapılırken bile çok zorlanırsınız. Ama siz dosya işlemlerine de girmişsiniz. O nedenle bazı şeyleri anlatabilmemiz sıkıntı olacak bizim size. Fakat genel olarak şunları diyebilirim;

C'de tanımladığınız bütün değişkenlerin türünü derleyiciye bildirmeniz gerekir. Örneğin size bir sayıyı tutabilecek bir değişken lazım. Eğer sayı tam sayı ise integer, short gibi türler ile bu değişkeni tanımlayabilirsiniz. Ama siz sayı tutacağınız değişkeni karakter dizisi olarak tanımlamışsınız.   (char sinifi[20];) Bu şekilde de aslında yapabilirsiniz fakat şu tanımladığını değişken ile 20 tane sayı da tutabilirsiniz. Kullanım olarak işinizi görebilir (sayıyı herhangi bir matematiksel işleme sokmadığınız için işinizi görebilir) fakat mantık olarak yanlış bir tanımlama.

scanf fonksiyonları daha önceden dediğim gibi adres ile yerleştirme yapar. Bir dizi ismi örneğin "sinifi"  gibi bir dizi ismi zaten adrestir. Nasıl adrestir? Dizi dediğimiz bellekte ardışıl olarak bulunan alanlar demektir. Siz bellekte toplamda 20 byte yer kaplayacak kadar bir dizi ayırmışsınız. Bu da sakıncalı işte bir byte lık bilgiyi tutmak için... Neyse işte bu 20 byte'lık ardışıl adres, sembolik olarak "sinifi" değişkeninde tutulur (yani sinifi burada adresin bellekteki başlangıç bölgesini temsil eder). Fakat "int sinifi" olarak tanımlarsanız adres değil nesne ismini temsil eder. Bu durumda scanf fonksiyonu da adreslerle işlem yaptığı için dizi isimlerini doğrudan kullanabilirsiniz. Fakat bir nesnenin adres bilgisini atamak için " &" operatörünü kullanmanız gerekir.

Bıu gibi biraz ileri konular için biraz erken gibi... Biraz daha başlangıç seviyesinden olaya giriş yapın derim...
".NET çemberinden geçen lirisist etkisi bir 'Volcano', bir yüzüm Java bir yüzüm Badalamenti Don Tano"
----------------------------------------------------------------------------------------------------------------------
"Her yer ölüm yine, burası dünya
Derken ölüm bile bu nasıl dünya?
Benden ölüm dile, batıyor gün yine
Burası dünya?