Şimdi Ara

C ile txt dosyasından float ve double veri okuma !!!!

Daha Fazla
Bu Konudaki Kullanıcılar: Daha Az
2 Misafir - 2 Masaüstü
5 sn
4
Cevap
0
Favori
2.878
Tıklama
Daha Fazla
İstatistik
  • Konu İstatistikleri Yükleniyor
0 oy
Öne Çıkar
Sayfa: 1
Giriş
Mesaj
  • 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 >







  • 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.
  • 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.
  • 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.
  • Yapay Zeka’dan İlgili Konular
    Daha Fazla Göster
    
Sayfa: 1
- x
Bildirim
mesajınız kopyalandı (ctrl+v) yapıştırmak istediğiniz yere yapıştırabilirsiniz.