Tam Sürümünü Görmek İçin : Yardım :Dosya içindeki aynı kayıtları ayıklamak
Arkadaşlar öncelikle yapmak istediğim bir txt dosyasının içinde bulunan aynı satırları çıkarıp tek olanları ayrı bir dosyaya yazmak
(gerçi burda ayrı dosyaya yazdırmayı denemedim sadece ekrana yazdırmaya çalıştım ama oda olmadı)
kodu bi inceleyip yardımcı olur musunuz ? iyi derecede c bilmiyorum kodları da google yardımıyla yazdım..
bide ayrıyetten dosya içinde bulunan "&" karakterleri yerine "enter" yazmam lazım
yani
ahmet&&veli
yi
ahmet
veli
olarak dönüştürmem lazım.. yardımlarınız için teşekkürler..
şimdiden çok sağolun..
#include "stdio.h"
#include "conio.h"
#include "string.h"
void main() //ana fonksiyonumuza girişimiz..
{
FILE *fp1; //dosyayı açmak için
char satir1[100],satir2[100],dosyaadi[50]; //dosyadan okuyacağımız satırlar için iki değişken
char *c,*d; //değişkenleri aktarmak için
int a,b,i;
a=b=0;
printf("Dosya ismini giriniz [Sonuna .txt eklemeyi unutmayin] -> ");
scanf("%s",dosyaadi);
while (c != NULL)
{
fp1 = fopen(dosyaadi,"r"); //dosyamızı açıyoruz
for (b=0;b<a+1;b++) //c nin herseferinde bir sonrakini alması için birkaç kere aldırıyoruz
{
c = fgets(satir1,100,fp1); //c yi okuyoruz..
}
d = fgets(satir2,100,fp1); //d yi aldık..
while (d != NULL) // c de d de son satır olmadığında devam
{
i=strcmp(c,d);
if (i==0)
{
fclose(fp1);
break; //eşitse başa git
}
d = fgets(satir2,100,fp1); // değilse d yi bir arttır
}
if (d != NULL)
{
printf("%s",satir1); //son satıra kadar eşit olmayanı yazalım..
a++;
}
fclose(fp1); //dosyamızı kapatıyoruz..
}
printf("\ncikmak icin bir tusa basiniz");//sonucu görmek için bekleme yapalım..
getch(); //tuş aldıktan sonra çıkıcaz..
}
acehreli
18/01/2006, 21:17
Merhaba,
Bir kac yorum yaptim. Benim yazdiklarimi [Ali] ile isaretledim...
Daha ileriye gidebilmek icin, yorumlarda da degindigim gibi, oncelikle
1) fopen'i icinde bulundugu while'dan onceye al
2) break'ten onceki fclose'u sil
3) sondaki fclose'u icinde bulundugu while'dan sonraya al
Boylece dOngUyu kirmis olacaksin.
// [Ali] Burada acili parantezlerle tirnak isaretleri kullanmak arasinda
// fark vardir. Kurallar onislemciye (preprocessor) bu konuda fazla
// ozgurluk tanidigi icin, geleneksel olarak kutuphane basliklari acili
// parantezlerle kullanilir:
// #include <stdio.h>
// Ama burada onemli degil...
#include "stdio.h"
// [Ali] Bende yok; cikartiyorum
// #include "conio.h"
#include "string.h"
// [Ali] Bunlari asagida kullanacagim
#define SATIR_UZUNLUGU 100
#define DOSYA_ADI_UZUNLUGU 50
// [Ali] main'in dOnUs tUrU int'tir; degistiriyorum
int main() //ana fonksiyonumuza girisimiz..
{
FILE *fp1; //dosyayi açmak için
// [Ali] Boyle sihirli sabitler kullanmak yerine onlari makro olarak tanimlayabilirsin
/* char satir1[100],satir2[100],dosyaadi[50]; //dosyadan okuyacagimiz satirlar için iki degisken */
char satir1[SATIR_UZUNLUGU],satir2[SATIR_UZUNLUGU],dosyaadi[DOSYA_ADI_UZUNLUGU]; //dosyadan okuyacagimiz satirlar için iki degisken */
// [Ali] Bunlar fazla kisa olduklari icin kotu isimler olmuslar
char *c,*d; //degiskenleri aktarmak için
int a,b,i;
a=b=0;
printf("Dosya ismini giriniz [Sonuna .txt eklemeyi unutmayin] -> ");
// [Ali] HATA: 49'dan daha fazla karakter girilirse tanimsiz davranis olusur
scanf("%s",dosyaadi);
while (c != NULL)
{
// [Ali] fp1 yalnizca bu kapsamda kullanildigina gore, burada tanimlanmasi daha iyidir
// Ornegin:
// FILE * fp1 = fopen(dosyaadi,"r");
fp1 = fopen(dosyaadi,"r"); //dosyamizi açiyoruz
// [Ali] Ayni sey diger degiskenler icin de gecerli; Hepsi bu kapsamda tanimlanabilirmis
// [Ali] Ayrica, daha ileriye gitmeden once fp1'in NULL olmadigini denetlemek gerek.
for (b=0;b<a+1;b++) //c nin herseferinde bir sonrakini almasi için birkaç kere aldiriyoruz
{
c = fgets(satir1,100,fp1); //c yi okuyoruz..
}
d = fgets(satir2,100,fp1); //d yi aldik..
while (d != NULL) // c de d de son satir olmadiginda devam
{
i=strcmp(c,d);
if (i==0)
{
// [Ali] Her seferinde dosyayi kapatip acmaya gerek yok
// Hatta boyle olursa, yukarida her fopen yapildiginda
// hep yine dosyanin basindan baslariz. Bu dongude takilir kaliriz. (Galiba?)
// Bence o fopen'i onun while'inin disina almak ve bu fclose'u da
// iyice sona tasimak gerek...
fclose(fp1);
break; //esitse basa git
}
d = fgets(satir2,100,fp1); // degilse d yi bir arttir
}
if (d != NULL)
{
printf("%s",satir1); //son satira kadar esit olmayani yazalim..
a++;
}
// [Ali] Ayni dosyayi iki kere kapatmis olmuyor muyuz?
// Yukaridaki break'ten once de kapatmistik...
fclose(fp1); //dosyamizi kapatiyoruz..
}
// [Ali] Bunu programa eklemek yerine, programi komut satiri gibi
// bir ortamda calistirin.
/* printf("\ncikmak icin bir tusa basiniz");//sonucu görmek için bekleme yapalim.. */
// [Ali] Bu islemin bu programin isiyle bir ilgisi yok; cikartiyorum
// getch(); //tus aldiktan sonra çikicaz..
// [Ali] Basariyla sonlandik; 0 dOndUrUyorum
return 0;
}
Kolay gelsin,
Ali
alicim öncelikle yardımların için çoooook teşekkür ederim..
dediğin birkaç eksiği düzelttim.. sağolasın....
// [Ali] Her seferinde dosyayi kapatip acmaya gerek yok
// Hatta boyle olursa, yukarida her fopen yapildiginda
// hep yine dosyanin basindan baslariz. Bu dongude takilir kaliriz. (Galiba?)
// Bence o fopen'i onun while'inin disina almak ve bu fclose'u da
// iyice sona tasimak gerek...
yok çok salak bi algoritma koydum oraya nası yapacağımı bulamadım da o nedenle..
şöyleki; dosya yı acinca a kadar tekrar c yi aliyorum.. yani a yi da herseferinde
bir arttırdığımdan hep bi sonraki oluyor ;)
------------------------------------
bunları yaptıktan sonra yine çalışmıyor.. :(
birde yardımcı olabilir misin birde en başta dediğim şeyler yapıla bilir mi ?
i -çıktı yı bir dosya ya kaydetmek
ii - bazı karakterler yerine enter ya da başka bi karakter koymak..
acehreli
19/01/2006, 06:50
i- printf aslinda fprintf'in stdout'u kullananidir. Yani eger printf yazdiginda aslinda sunu yazdigini bilirsen, stdout'un yerine baska bir FILE* kullanarak istedigine ulasabilirsin:
printf("merhaba");
fprintf(stdout, "merhaba"); // <-- usttekiyle ayni sey
ii - Bunu yapmanin herhalde bir kac yolu vardir. En kolayi, ismi dizgi_yazdir gibi bir islev yazabilirsin. Onun icinde dizginin (string) basindan sonuna kadar ilerler, her bir karaktere bakarsin; eger aradigin karakterse, '\n' karakterini yazdirirsin.
void dizgi_yazdir(FILE * hedef, char const * dizgi)
{
/* ... */
if (*dizgi == OZEL_KARAKTER)
{
fprintf(hedef, "\n");
}
else
{
/* ... */
}
/* ... */
}
Ali
ali bey çalışmıyor.. :(:( ekleme yapmadım sadece ayıklasın dedim ama çalışmıyor :(
Forum Yazılımı : vBulletin v3.6.8, Copyright ©2000-2008, Jelsoft Enterprises Ltd.