Arama butonu
Bu konudaki kullanıcılar: 1 misafir
3
Cevap
2934
Tıklama
0
Öne Çıkarma
C ile txt dosyasından float ve double veri okuma !!!!
H
20 yıl
Yüzbaşı
Konu Sahibi

Bir text dosyadaki verileri C'de işlemem gerekiyor. Bu amaçla dosyayı açıp değişkenleri okuduğum zaman değişkenin noktadan sonraki kısmında sorun yaşıyorum. Örneğin float verileri içeren dosyada

7992.504285 2.988834 9206.547066 verileri varken değişkenlerde
7992.504395 2.988834 9206.546875 verieri oluyor.

Float tipinin duyarlılığının yetmediğini düşünerek bu kez verileri double formatında dosyaya yazdım. Bu kez double formatında okuduğum veriler tamamen anlamsızdı.

Program kodunu aşağıda veriyorum. Özellikle double tipi ile ilgili sorunun nerden kaynaklandığı konusunda yardımcı olursanız sevinirim.

Not: Veriler dosyada aralarında bir boşluk karakteri ile bulunuyor. "7992.504285 2.988834 9206.547066 1591.434319" , "4.801184e+002 4.357349e+003 5.415224e+003 2.415224e+003" gibi


 
#include <stdio.h>
#include <string.h>
#include <conio.h>

const char directory[]= "C:\\MATLAB6p5\\work\\flicker_ohuchi\\";

int main()
{
double d1,d2,d3;
float f1,f2,f3;
char inf1[70],inf2[70];

FILE *infile;

strcpy(inf1,directory);
strcpy(inf2,directory);
strcat(inf1,"input_double.txt"); // double data
strcat(inf2,"input_float.txt"); // float data

infile=fopen(inf1,"rt");
fscanf(infile,"%e %e %e",&d1,&d2,&d3); // read double data
printf("%e %e %e\n",d1,d2,d3); // display them

infile=fopen(inf2,"rt");
fscanf(infile,"%f %f %f",&f1,&f2,&f3); // read float data
printf("%f %f %f",f1,f2,f3); // display them

getch();

fclose(infile);
return 0;
}



Edit: Verilerin dosyada bulunma biçimi hk.





< Bu mesaj bu kişi tarafından değiştirildi HYP -- 16 Ekim 2005, 0:30:04 >

N
20 yıl
Yüzbaşı

arkadaşım eğer dosyadaki bilgilerin üzerinde matematiksel işlem yapmıyacaksan ve amacın onları göstermekk ise
dosyadan string formatında al bu fonksiyonu kullana bilirsin

char *fgets(char *str, int num, FILE *fp);

daha sonrada aldığın gibi ekrana yazdır

ama eğer matematiksel işlemler yapmayı düşünüyorsan fscanf in içinde %e yerine %f kullan, hatta %4.6f olarak kullan belki düzelir
veya string olarak aldığın sayıları daha sonra sayıya çevir.


Bu mesaja 1 cevap geldi.
H
20 yıl
Yüzbaşı
Konu Sahibi

NewVatoo: Bahsettiğin biçimli okumayı denemiştim ancak o da olmuyor. Sayılarla matamatiksel işlemler yapacağımdan doğrudan double değişkenlere okumam lazım ve veri miktarı çok fazla. Yani string sayı dönüşümü ile vakit kaybetmemem gerekiyor.


Bu mesaja 1 cevap geldi.
H
20 yıl
Yüzbaşı
Konu Sahibi

float f1=7992.504285 yapıp bunu printf ile gösterdiğimde bile sonuç farklı oluyor (7992.504395). Sanırım sorun float tipinde. Ve kısmen anladım gibi.

IEEE standardına göre 4-baytlık float tip bit tanımlaması şöyle

31-30 bit aralığı (1bit) : işaret biti
30-23 bit aralığı (8bit) : üs
0-22 bit aralığı (23bit) : noktalı kısım.

Girdiğim sayıların tam sayı ve virgüllü kısmı 22-biti aşınca sorun çıkıyor. Üstteki sayının tam kısmı 13 bitlik yer kaplıyor. Noktadan sonraki kısımda değişim (hata) 10. bitte başlıyor. Yani veri ayrılan 22-bitlik kısmı aşıyor. Yani float tipi 3.4E+308 e kadar verileri saklayabiliyor ancak sayının tam kısmı büyüdükçe noktadan sonraki kısımda hassasiyet azalıyor.

Bu post'u daha sonra birileri bu sorunla karşılaşırsa diye bilgi amaçlı yazdım.



DH Mobil uygulaması ile devam edin. Mobil tarayıcınız ile mümkün olanların yanı sıra, birçok yeni ve faydalı özelliğe erişin. Gizle ve güncelleme çıkana kadar tekrar gösterme.