Tam Sürümünü Görmek İçin : ifstream kullanarak float okumak
Selam arkadaslar
Asagidaki gibi degerlerin bulundugu bir "zzz.txt" dosyam var. Buradaki her degeri bir degiskene atmak istiyorum. yani fscanf(%f %f %f %f %f,x,y,x1,y1,c) te oldugu gibi. Bunu "ifstream" nesnesini kullanarak nasil yapabilirim?
Saygilar
8 8 0.000000 0.000000 -1
8 16 0.000000 0.000000 -1
8 24 0.000000 0.000000 -1
8 32 0.000000 0.000000 -1
8 40 0.000000 0.000000 -1
8 48 0.000000 0.000000 -1
8 56 -3.529637 0.100041 -1
8 64 -1.621111 0.075903 1
8 72 -2.363358 0.074676 1
8 80 -3.756783 0.007939 -1
8 88 -3.888286 0.091279 -1
8 96 -4.050601 0.141380 -1
Bunu "ifstream" nesnesini kullanarak nasil yapabilirim?
bunu ifstream sınıfını kullanarak aşağıdaki gibi yapabilirsin:
#include <fstream>
...
ifstream infile;
infile.open("zzz.txt", ios::in); // ios::in arümanı zorunlu degil..
while (!infile.eof()) // infile ya da infile.good() da olabilir..
infile >> x >> y >> x1 >> y1 >> c;
tavsiyem (eger hafıza zorunları yoksa) float yerine double kullanman... kendini böle alıştır.. aslında kod yazarken 0.12 gibi bir sabiti bir double degeridir... bunun float karsılıgı 0.12F tir...
acehreli
13/05/2005, 23:38
neolion, ben de oncelikle sckz gibi double kullanmani onerecektim. float turunu tamamen unut. C ve C++ dillerinin kabul ettigi kesirli sayi turu double'dir. float'u ancak cok ozel programlarda ve getirdigi kucuk bellek kazancinin kesinlikle gerektigi durumlarda kullan.
sckz, aslinda open'a da gerek yok; ve eof() kullanilmamali, cunku dosya sonuna gelindigini belirten ozel bir durum o... Dosyaya baska nedenlerle erisilememis olabilir. good() yerine de dogrudan dosyanin kullanilmasi daha alisildik bir kullanim:
ifstream infile("zzz.txt");
if (infile)
{
/* ... */
}
Ali
ali hocam, lrod_exador un odevinde 8) yaptıgım bir hata bu eger student.txt olmazsa cpu kullanımı tavana vuruyo (zonzus döngü)... o yüsden !infile.eof() kullanmak yerine infile daha mantıklı.. o zaman WinXP hatarı raporu gönder dalgası çıkıyo... bunu aklımın iyi bir köşesine yasmam gerek...
open ise tarz meselesi.. normalde ios::in e de gerek yok... ilerde kloğz kullanacağım için opın ı da koyayim diyorum...
acehreli
14/05/2005, 03:20
Aslinda ileride close() kullanmaya gerek yok, cunku otomatik nesne kendi yasami sona ererken akimi kendisi otomatik olarak kapatacak. Acikca kapatmak, ancak yeniden baska bir isimle veya sekilde acilacaksa mantikli geliyor. Daha once bir kac kere boyle bir durumla karsilastim ama yaygin oldugunu dusunmuyorum.
Eger close() cagirmak zorunda kalacak bir tasarim yapmissak; bu da tasarimda bir yanlislik oldugunu gosterebilir. Cunku program olasi bir aykiri durum atilmasi durumunda close() satirina hic gelemiyor olabilir. Bunun yerine, burada da RAII yontemi kullanilmalidir. (Yani kaynaklar kod icinde acikca degil, bozucu islevlerde (destructor) geri verilmelidir.)
ifstream de aslinda RAII'yi uygulayan bir sinif oldugu icin, zaten temel amaclarindan birisi akimi bozucu islevinde geri vermektir. Hem bu isi yapan bir sinif kullanmak hem de onun isini ondan once yapmak gibi geliyor.
Ali
Euclides
14/05/2005, 11:39
float ile double arasında ne fark var ?
(yeah float daha küçük ama gerçekten ne fark var ? bende hep double kullanıyorum ama farkı bilmek isterim..)
http://support.microsoft.com/default.aspx?scid=kb;en-us;71424
adrese bi klikle..
neolion,
sckz, aslinda open'a da gerek yok; ve eof() kullanilmamali, cunku dosya sonuna gelindigini belirten ozel bir durum o... Dosyaya baska nedenlerle erisilememis olabilir. good() yerine de dogrudan dosyanin kullanilmasi daha alisildik bir kullanim:
ifstream infile("zzz.txt");
if (infile)
{
/* ... */
}
Ali
Cevaplariniz icin cok tesekkur ederim. Ali hocam, open metodunu ifstream nesne arrayi icin kullanmak zorundayim sanirim yani,
ifstream infile[100];
string filename[100];
for(int i=0;i<100;i++) infile[i].open(filename[i].c_str());
dogrumu?
eoffile kullanmadan, while dongusu ile nasil bir dosyayi okutabilirim? birazdaha acarsan sevinirim.
saygilar
bende bişiler söliyim hatam varsa ali hocama danışırız...
normalde eof() dosya sonuna ulaşıldığını belirten bişi olduğu için ve herhangi bir neden den dolayı dosya sonuna ulaşılamayabileceğiı için ve kullandığın döngünün zonzusa girmemezi için while (!infile[i].eof()) yerine while (infile[i]) kullanmak daha mantıklı... while (infile) ""basitçe"" EOF gelene kadar ya da bir hata oluşana kadar oku demek...
senin kodundaki dosya icindeki bilgileri okumanın birkaç yolu var..
basitçe dosyadaki bilgiler herhangi bir ayraçla (bu genelde boşluk ya da '\n') ayrılmış dosya ise ve sen bunu alıp programındaki degiskenlere atamak istiyorsan :
test.txt -> 123 abbas
gibi şeyler içersin(ne bileyim o 100 dosya benzer düzende olsun)
string armut[100];
int murtazaman[100];
for (int f=0; f<100; ++f)
while (infile[f]) infile[f] >> murtazaman[f] >> armut[f];
gibi gibi...
ama eger amacın sadece dosyadaki bilgiyi alıp bir baska akısa göndermekse (örneğin cout)
for (int f=0; f<100; ++f)
while(infile[f]) cout << infile[f].rdbuf(); // bu üye fonksiyon fileBuffer ın işaretçisini döner..
seninde belki dikkatini çekmiştir... heryerde bu 100 sayısını kullandık.. bu sayıyı degistirmek istedigimde ugras dur... en iyisi onu sabit bir değişken (nasıl oluyorsa 8) ya da enumerator olarak deklare etmek uygun olur...
bi de çok güzeli string falan kullanmışsın ama c++ a daha yakın bir kod yazmak istersen basit diziler yerine bence std::vector de bi dene...
bunu bi de ali hocama danışmak lasım...
acehreli
16/05/2005, 22:04
Kisa notlar...
ifstream gibi C++ akimlari vector gibi topluluklarda barindirilamazlar, cunku vector'un gerektirdigi kopyalanabilirlik sartini karsilayamazlar.
Bu gibi topluluklarda ancak gosterge (aslinda tabii ki akilli gosterge) kullanmak gerekir:
#include <boost/shared_ptr.hpp>
/* ... */
typedef boost::shared_ptr<ostream> CikisAkimi_Gosterge;
typedef std::vector<CikisAkimi_Gosterge> CikisAkimlari;
/* ... */
CikisAkimlari akimlar;
akimlar.push_back(CikisAkimi_Gosterge(new ofstream("deneme.txt")));
sckz, ben o yuzden "sabit degisken" dememeye ozen gosteriyorum :). Boyle bir durumda ya kisaca "sabit", ya da cok karisiklik yaratmayacaksa "sabit nesne."
Ali
ali hocam cok sağolun yararlı bilgiler için..
aslında sölediğim şey var olsa bile sizin dediğiniz cok daha mantıklı.. cunku aradan herhangi bi öğeyi silersek ya da herhangi bi sıralama yaparsak kocaman nesnelerin bellekte hareket etmesi olayı baya masraflı.. pointır kullanmak en mantıklısı... (hemen karar vermek yanlış bir tutum, en mantıklısı yerine daha mantıklı demek daha mantıklı olabilir... böyle davranmamalıyım)
sabit konusunda şöyle bi sorun var... genelde sabit dediğimde (herhalde ceviri kitaplardaki sorunlardan dolayı) literal (15.3 gibi degerler) anlaşılıyo... o yüsden sabit değişken demeyi tercih ediyorum (bi bellekte yer kapladığı için).. sabit nesne de hoşmuş... bundan sonra onu da kullanabilirim (-miyim).. (bu arada şimdi farkettim (amma çok parantez kullandığımı)..)
Cevaplariniz icin cok tesekkur edrim, supersiniz. Tekrar bir sorum var cahilligimi bagislayin. ifstream ile actigim dosyalarin iceriklerini bir defa okutabiliyorum. ama ikinci defa ayni dosyayi while(infile) dongusu ile okuturken, okuyamiyor. Sanirim while dongusu icindeki "inpfile" dosyasi daha once birkere okundugu icin ikinci denemede EOF olarak gorunuyor.
bunu nasil engelleyebilirim? saygilar
seekg(0,0) denedim olmadi. while dongusu gene calsimadi.
hata nedir.. derleyici ne gibi bi hata veriyo...
bu tepedekini unut.. üsteki yazını görmemiştim..
şimdi sen infile ı okurken bi kere eof a ulaştı... senin önce eof bitini temizlemen lasım... bunun için :
infile.clear();
infile.seekg(0); // infile.seekg(ios::beg); de diyebilirsin...
demen yeterli...
derleyici hic bir hata vermiyor. dosyadan verileri bir fonksiyon kullanarak okutuyorum. fonksiyon icinde asagidaki while dongusu var. line[snum] ise "typedef struct".
while(vel_inp[i]){
vel_inp[i]>>x>>y>>U>>V>>cor;
if(U!=0.||V!=0.){
line[snum].x=x*23.4375e-6; // (m)
line[snum].y=y*23.4375e-6; // (m)
line[snum].U=U*23.4375/2.; // (m/s)
line[snum].V=V*23.4375/2.; // (m/s)
line[snum].cor=cor;
snum++;
}
birinci okumada hic bir sorun yok. ama ikinci okumada (yani fonksiyonu ayni dosya icin ikinci defa cagirdigimda) while dongusune girmeden geciyor. vel_inp[] ifstream nesnesi dosyasi global konumda.
bir onceki cevabıma bak... ben senin usteki yazını görmediğğim için öle dedim.. derleyicinin hata vermemesi normal çünkü ortada hata yok... sadece bir yanlış var...
Tamamdir. sayende cozdum problemi. cok tesekkur ederim.
Son bir soru, bu dosya islemlerinde <fstream> tavsiye edersiniz yoksa klasik C deki "FILE* fp=fopen(...." mi tavsiye edersiniz. Biraz gec oldu ama :) fstream hakkindada epey sey ogrenmistim....
walla ben fstream i tavsiye ederim.. aynı zamanda c deki kullanımı pek iyi bilmiyorum (eğer php dekine benziyosa biliyorum)... ben c++ kullanımını tavsiye ederim... çünkü kullandığın derleyici sana daha çok yardım edecektir.. hem ne bileyim...
diyelim ki bir sınıf ın bir nesnesi ile bilgileri ekrana yazdıran şöle fonksiyonun var (sadece deklarasyonunu yazdım.. şimdilik tanımıyla ilgilenmiyoruz)...
class armut
{
...
public :
friend ostream & operator << (ostream &, armut&);
};
...
int main()
{
armut a;
cout << a;
}
sen böle yazdığında ilerde cıktıyı herhangi bi dosyaya yazmak istersen...
cout yerine hangi akış nesnesini kullanmak istiyorsan onu yazabilirsin...
int main()
{
armut a;
cout << a;
outfile << a;
}
gibi gibi...
c de bu tip şeyler yapabilir misin bilmiyorum... bunu c den iyi anlayan bir arkadaşın yanıtlaması gerekiyo.. (birde Robert Lafore (kendisi Nesne Yönelimli C++ Programlama kılavuzu kitabı nın yazarı) c++ akışlarının c io fonksiyonlarına göre birsürü avantajının olduğunu kitabında belirtmiş..)
C++ daki şekli bir nesne ;kurucusu , yokedicisi var.
mesela yokedicisi, nesne kapsamdan çıkınca, dosyayı kapatıyor.
acehreli
19/05/2005, 22:22
mr1yh1'in dedigini soyle desteklemek istiyorum: C++'ta C yontemlerinin bazilari uygulanamazlar. Ozellikle kaynaklarin kod icinde acikca geri verilme yontemini tamamen unutmak gerekir.
FILE * dosya = fopen(/* ... */);
hata_atabilecek_islemler(/* ... */);
fclose(dosya);
Kaynak geri verilememis (dosya kapatilamamis) olabilir. C'de aykiri durumlar (exceptions) olmadigi icin orada boyle bir sorun yoktur.
Onun icin C++'ta C++'ca dusunmek ve C++ yontemlerini uygulamak gerekir.
Ali
Forum Yazılımı : vBulletin v3.7.3, Copyright ©2000-2008, Jelsoft Enterprises Ltd.