Strona 1 z 1

Wczytywanie liczby z pliku do zmiennej float.

Nowy postNapisane: wtorek, 3 marca 2009, 22:22
przez GoldWolf
Witam, mam taki problem wczytuje sobie z pliku takie dane np:

1 ->5.45
2 ->3.25
3 ->2.9
4 ->3.3,

a w program jest tak:
Obrazek

Wiem, że liczby zmiennoprzecinkowe muszą być dopełnione(float 32bity), ale dlaczego liczby 1 i 4 są błędnie przedstawione(wczytane).
Wczytuje przy użyciu:
Kod: Zaznacz cały
sscanf(bufor.c_str(), "%f.2", &kurs[licz]);

I wygląda na to, iż liczba 2 jest obcięta %f.2, trochę jestem zbity z tropu. Obrazek z StringGrida.

Re: Wczytywanie liczby z pliku do zmiennej float.

Nowy postNapisane: wtorek, 3 marca 2009, 22:40
przez polymorphism
Wczytane to one mogą być poprawnie, ale natura kodowania zmiennoprzecinkowego jest taka, że nie wszystkie zakodowane w nim liczby są dokładnie takie, jakie chciałbyś żeby były 8)

Re: Wczytywanie liczby z pliku do zmiennej float.

Nowy postNapisane: czwartek, 5 marca 2009, 11:04
przez Cyfrowy Baron
To efekt zaokrąglania. Podaj cały kod odpowiedzialny za wczytywanie danych z pliku i ich wyświetlanie.

Re: Wczytywanie liczby z pliku do zmiennej float.

Nowy postNapisane: czwartek, 5 marca 2009, 12:11
przez Miroo_007
Jakiego separatora używasz ( przecinek czy kropka)? Samodzielnie możesz ustawić odpowiedni separator:
Kod: Zaznacz cały
#include <sysutils.hpp>
//-----------------------------
DecimalSeparator = '.';

Re: Wczytywanie liczby z pliku do zmiennej float.

Nowy postNapisane: czwartek, 5 marca 2009, 17:52
przez GoldWolf
Trochę ten kod jest większy mam nadzieje, że tyle starczy. Plik zostaje zapisany w buforze, a potem ten bufor jest systematycznie obcinany by pozbyć się nie potrzebnych danych.

Kod: Zaznacz cały
using std::sscanf;
licz = stan;

   strumien.open(nazwa, ios::in);
   if(!strumien.is_open()){
      Application->Terminate();
      strumien.close();
      ShowMessage("Błąd odczytu kursów");
      return;
   }else{
      strumien.seekg(8500);
      while(!strumien.eof()){
         getline(strumien, bufor);
         bufor1 += bufor;
      }
      strumien.clear();
      strumien.close();

// to ostatni etap kodu, który odczytuje tylko wartość, część kodu ominąłem bo jest to tylko obcinanie bufora metodą find
//klasy string
if(bufor.find(".") != string::npos){
                  miejsce = bufor.find(".");
                  bufor.assign(bufor, miejsce - 1, 4);
                  sscanf(bufor.c_str(), "%f.2", &kurs[licz]); //?????????
               }



Potem pobraną wartość liczbową najczęściej w formacje 2.5, 3.45, 2.55 (kursy w zakładach bukmacherskich) zostaje zapisana w bazie

Kod: Zaznacz cały
strumien.open("Typer.typowy", ios::in | ios::out | ios::binary);
   if(!strumien.is_open()){
      Application->Terminate();
      strumien.close();
      ShowMessage("Problem z bazą !!!");
      return;
   }else{
      strumien.seekg(0);
      strumien.read((char *)&Grupa, sizeof(Grupa));
      for(licz = 0; licz < 9; licz++){
         [b]Grupa.kurs_k[licz] = kurs[licz]; //???????????????????????????
      //      Grupa.wygrana[licz] = kurs[licz] * Grupa.stawka_klubu[licz];
         bufor = (float)( kurs[licz] * Grupa.stawka_klubu[licz]); //????????????????????????????????????
         sscanf(bufor.c_str(), "%f.2", &(Grupa.wygrana[licz]));  // tutaj ponownie stosuje f.2 gdyż myślałem, iż uda mi się obciąć flota
//problem ten poruszyłem w osobnym temacie odnoście Tstringgrid, albo przynajmniej zapisać w formacie 3.230000000
      }
      strumien.seekg(0);
      strumien.write((char *)&Grupa, sizeof(Grupa));
      if(strumien.fail())
         Label1->Caption = "Jakiś problem z zapisem!";
      strumien.close();
   }


A na koniec wszystko jest wyświetlane

Kod: Zaznacz cały
StringGrid1->Cells[0][0] = "Nazwa";
   StringGrid1->Cells[1][0] = "Kurs";
   StringGrid1->Cells[2][0] = "Stawka";
   StringGrid1->Cells[3][0] = "Kurs_K";
   StringGrid1->Cells[4][0] = "Bilans";
   StringGrid1->Cells[5][0] = "Pudło";

   strumien.open("Typer.typowy", ios::in | ios::binary);
   strumien.seekg(0);
   strumien.read((char *)&Grupa, sizeof(Grupa));
   strumien.close();
   if(stan == 0){
   for(licz = 0; licz < 9; licz++){
      StringGrid1->Cells[0][licz + 1] = AnsiString(Grupa.nazwa[licz]);
//      StringGrid1->Cells[1][licz + 1] = Grupa.
      StringGrid1->Cells[2][licz + 1] = Grupa.stawka_klubu[licz];
      StringGrid1->Cells[3][licz + 1] = Grupa.kurs_k[licz];//?????????????????????????????????
      StringGrid1->Cells[4][licz + 1] = Grupa.bilans[licz];
      StringGrid1->Cells[5][licz + 1] = Grupa.bez_remisu[licz];
      StringGrid1->RowCount++;
      if(Grupa.bez_remisu[licz] > 7)
         Edit1->Text = "!!! Ważne !!! podział";
   }


Sorry, że tak dużo ale chcieliście kod więc musiałem te fragmenty kodu wprowadzić. W systemie nie ustawiałem separatorów, pobieram z pliku i używam separatora ".", TStringGrid używa separatora ",", który pewnie jest domyślnie z systemu pobierany.
Zmiana separatora nie pomaga. Jest to fragment kodu tak obcięty by pokazać jak przebiega cały proces pobierania, zapisu i odczytu danej...
Pytajnikami oznaczone miejsca jak przechodzi dana wartość przez ten fragment kodu.

Re: Wczytywanie liczby z pliku do zmiennej float.

Nowy postNapisane: czwartek, 5 marca 2009, 19:32
przez polymorphism
A nie możesz po prostu:
Kod: Zaznacz cały
StringGrid1->Cells[3][licz + 1] = AnsiString().sprintf("%.2f", Grupa.kurs_k[licz]);

Re: Wczytywanie liczby z pliku do zmiennej float.

Nowy postNapisane: czwartek, 5 marca 2009, 20:21
przez GoldWolf
Wpadłem na coś innego, ale robiącego to samo :

Kod: Zaznacz cały
StringGrid1->Cells[1][licz + 1] = FormatFloat("0.00", kurs[licz]);