PDA

Tam Sürümünü Görmek İçin : dosya dan değer okuma


PUNK
31/01/2006, 14:55
merhaba ..

dosyaya int double türünde

1,20124
2,2356
0
-25,4
$
12
54
65
$
..
..
..


şeklinde veri kaydediyorum dosyayı okumak istediğimde ..

bu verileri $ karakteriyle karşılaşması durumuna göre sıra sıra farklı matrislerin içine yerleştirmek istiyorum

mesela ilk $ karakterini görünceye kadar a vektörüne ekle ikincisini gördüğünden itibaren b vektörüne ekle gibi bunu tam olarak nasıl yapabilirim


yapmaya çalışıtığım şey tuhaf gelebilir. farklı bi yöntemde önerebilirsinz ama boyle yapmak istiyorum :)


acehreli
01/02/2006, 00:48
Bence en iyisi, satiri once bir dizgiye okumak (ornegin std::string), ondan sonra gerekeni yapmak:


if (satir == "$")
{
/* sonraki vector'e gec */
}
else
{
istringstream akim(satir);
double sayi;
akim >> sayi;
/* ... */
}


Ama sanirim giriste virgul yerine nokta kullanmak gerekebilir. Veya locale ayarlari ile virgul kullandildigi belirtilebilir. (Bunun nasil yapildigini bilmiyorum.)

Ali

PUNK
02/02/2006, 10:58
dosyaya kaydedilen double değerlerin virgül veya nokta ile ayrılmasını değiştrebilirmiyim ;

programı kullandığım her bilgisayarda bu ayarı nokta haline mi getirmem mi gerekir

yada bu sorunu nasıl çözerim

mazbil
02/02/2006, 13:44
Yanlış hatırlamıyorsam kayan noktalı sayılarda "." kullanılır. Bu sabittir. Dolayısıyla kodunda buna göre olmalıdır.

Her satırda okuduğun bütün değerleri double (veya float) okursan, int tipinden sayılarda herhangi bir sıkıntı çıkmaz. Yani; o anda okuduğun satırdaki rakamda "," varsa double, yoksa int olarak oku -bana göre- gereksiz bir programlama adımıdır.

acehreli
02/02/2006, 19:35
mazbil, kod icinde nokta kullanilir ama kulturlerin farkli tercihleri oldugu icin, bu is locale duzenegi ile cozulmustur (cozulmeye calisilmistir).

locale'lerin ne adlari ne de davranislari standart tarafindan tanimlandigi icin, kendi platformumuza bagliyiz. Ornegin benim SuSE Linux ortamimdaki tr_TR locale'i sayilar icin virgul degil nokta kullaniyor.

Virgul kullanildigini bildigim Fransiz locale'inin bir ornegi:


#include <iostream>

using namespace std;

int main()
{
cin.imbue(locale("en_US"));
cout.imbue(locale("fr_FR"));

double sayi;
cin >> sayi;
cout << sayi << '\n';
}


Bu yalnizca kucuk bir ornek; aslinda locale'ler tarih duzeni gibi baska bir suru seyi da kapsiyorlar. Daha ayrintili bilgi icin Stroustrup'un kitabina bakabilirsiniz. Ama galiba locale'leri yeni baskilarinda daha fazla yer veriyor. (Bendeki kitap eski.)

Bu arada, sistemimde tanimli locale'leri "locale -a" komutu ile ogrendim...

PUNK, sen de sistemindeki tr_TR locale'ini cin uzerinde uygulayip bakabilirsin. Eger virgul kabul etmiyorsa belki de fr_FR gibi bir locale'le idare edebilirsin.

Tabii aslinda kendi locale'ini tanimlamak da mumkun ama daha fazla bilmiyorum. :)

Ali