PDA

Tam Sürümünü Görmek İçin : Dosyada kaç satır var?


101
19/12/2004, 17:13
Elimizde içinde satır düzeninde isimler bulunan bir txt dosyamız olsun. Bu dosya kaç satırdan oluşmuş nasıl öğrenebiliriz?
(fseek ve ftell ile yapılabilir fakat bu sefer de isimlerin uzunluklarını bilmemiz gerekiyor. Uzunlukları hakkında bir bilgimiz olmadan nasıl halledebiliriz? )


ceeyt
19/12/2004, 22:27
#include <iostream>
#include <fstream>

using namespace std;

int main(void)
{
char isim_[15];

ifstream giris("c:\\isimler.txt",ios::in);

unsigned int sayac_ = 0;

while(giris >> isim_)
{
sayac_++;
}

cout << sayac_ << endl;

return 0;
}


Her okumadan sonra da sayac bir kez arttiriliyor. istedigin isi yapan bir kutuphane fonksiyonu aklima gelmiyor.

istersen isim_ degiskenini std::string yapabilirsin, boylelikle degiskene std::string'e ait ozellikleri kazandirirsin ve std::string fonksiyonlarini uygulayabilrisin.


umarim yardimci olabilmisimdir,kolay gelsin...

101
19/12/2004, 22:36
Yanıtın için teşekkürler.
Aklıma ilk gelen buydu. Biraz önce lseek i keşfettim. Bi kaç deneme daha yapayım.

ceeyt
19/12/2004, 22:44
onun icin sunu deneyebilirsin;


#include <iostream>
#include <fstream>

using namespace std;

struct AdSoyad {
char isim_[15];
char soyad_[25];
};

int main(void)
{
AdSoyad adsoyad_;

ifstream giris("c:\\isimler.txt",ios::in);

unsigned int sayac_ = 0;

while(giris >> adsoyad_.isim_ >> adsoyad_.soyad_)
{
sayac_++;
}

cout << sayac_ << endl;

return 0;
}


eger bir satirda kac sozcuk olacak bilmiyorsan, getline( ) kullanabilrisin.
Yine her seferinde sayaci arttirirsin.

101
19/12/2004, 22:54
while(giris >> isim_)
Burası ne yapıyor onu anlayamadım.?

ceeyt
20/12/2004, 01:43
giris akimindaki ilk degeri, 'isim_' degiskenine atiyor.

Bu arada sormak icin biraz gec oldu ama :uff: C de mi yazmayi dusunuyorsun?
:( :(

Eger C dusunuyorsan , ayak bagi oldum belkide kafani karistirdim kusura bakma...

Euclides
20/12/2004, 09:15
DOS formatlı text dosyaları için 0xA,0xD ikilisinin sayısı kadardır
UNIX formatlı text dosyaları için 0xA sayısı kadardır...
MAC editörleri için... ???????

101
20/12/2004, 09:25
Evet C. Kafam karışmadı. Ama satır sayısını öğrenmek dosyanın içindeki herhangi bir veriyi okumadan olması gerekiyor.
Euclides peki o ikiliyi program içinde nasıl sayıcaz?

Euclides
20/12/2004, 12:51
Peki stdlib ile yapalım

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
int main(void)
{
FILE *f;
usigned int nFileSize,nLineCount=0;
char *szData;
f=fopen("test.txt","r");
nFileSize=fseek(f,0,SEEK_END);
fseek(f,0,SEEK_SET);
szData=malloc(nFileSize);
fread(szData,1,nFileSize,f);
fclose(f);
for(unsigned int i=0;i<nFileSize;i++)
{
if(szData[i]==0xA)
{
nLineCount++;
}
}
printf("%d\n",nLineCount);
return 0;
}

acehreli
21/12/2004, 01:40
Euclides, eger kUtUk "text mode"da acilmissa, '\n' karakterlerinin cikisa ne sekilde gonderildiklerini bilmek zorunda degilizdir. Bulundugumuz ortamdaki kutuphane gerekli donusumu bizim icin yapar. (Bunlari 0xa, 0xd'lerle ilgili olarak soyledim.)

Ali

Euclides
21/12/2004, 12:32
bilmek mi bilmemek mi ?
bence bilmek.. !!!

101
21/12/2004, 16:49
Satır sayısını öğrenme ile ilgili başka birisinden şu kodu aldım. Çok daha anlaşılır ve daha kolay bir kod:

FILE *fs;
fs=fopen("isimler.txt","r");
while (fscanf(fs, "%*s") != EOF)
i++;
printf("--satir:%d",i);
Şimdi bir de istediğim satıra direk ulaşabilme sorununu aşmam gerek.

acehreli
21/12/2004, 19:05
101, satira dogrudan ulasabilecegini sanmiyorum. Bence i'nin degerine bakarak karar vereceksin.

Ali

101
21/12/2004, 19:59
Evet. Doğrudan satıra ulaşılmıyormuş. Ancak o satıra kadar olan isimleri okutup yapacağız. Konu kapandı sanırım.