Wczytywanie liczby z pliku do zmiennej float.

dział ogólny

Wczytywanie liczby z pliku do zmiennej float.

Nowy postprzez GoldWolf » wtorek, 3 marca 2009, 22:22

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.
Tylko dwie rzeczy są nieskończone: wszechświat oraz ludzka głupota, choć nie jestem pewien co do tej pierwszej. - Albert Einstein

Błędów nie popełnia ten, kto nic nie robi. - Theodore Roosevelt
Avatar użytkownika
GoldWolf
Homos antropiczny
Homos antropiczny
 
Posty: 116
Dołączył(a): piątek, 16 stycznia 2009, 18:42
Podziękował : 8
Otrzymał podziękowań: 0
System operacyjny: Siódemka Profesjonalna
Kompilator: Microsoft Visual Studio 2010
Version 10.0.30319.1
Gadu Gadu: 0
    NieznanyNieznana

Re: Wczytywanie liczby z pliku do zmiennej float.

Nowy postprzez polymorphism » wtorek, 3 marca 2009, 22:40

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)
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2157
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 19
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    NieznanyNieznana

Re: Wczytywanie liczby z pliku do zmiennej float.

Nowy postprzez Cyfrowy Baron » czwartek, 5 marca 2009, 11:04

To efekt zaokrąglania. Podaj cały kod odpowiedzialny za wczytywanie danych z pliku i ich wyświetlanie.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4719
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana

Re: Wczytywanie liczby z pliku do zmiennej float.

Nowy postprzez Miroo_007 » czwartek, 5 marca 2009, 12:11

Jakiego separatora używasz ( przecinek czy kropka)? Samodzielnie możesz ustawić odpowiedni separator:
Kod: Zaznacz cały
#include <sysutils.hpp>
//-----------------------------
DecimalSeparator = '.';
Avatar użytkownika
Miroo_007
Intelektryk
Intelektryk
 
Posty: 160
Dołączył(a): sobota, 18 października 2008, 10:49
Lokalizacja: Rzeszów
Podziękował : 0
Otrzymał podziękowań: 0
    NieznanyNieznana

Re: Wczytywanie liczby z pliku do zmiennej float.

Nowy postprzez GoldWolf » czwartek, 5 marca 2009, 17:52

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.
Tylko dwie rzeczy są nieskończone: wszechświat oraz ludzka głupota, choć nie jestem pewien co do tej pierwszej. - Albert Einstein

Błędów nie popełnia ten, kto nic nie robi. - Theodore Roosevelt
Avatar użytkownika
GoldWolf
Homos antropiczny
Homos antropiczny
 
Posty: 116
Dołączył(a): piątek, 16 stycznia 2009, 18:42
Podziękował : 8
Otrzymał podziękowań: 0
System operacyjny: Siódemka Profesjonalna
Kompilator: Microsoft Visual Studio 2010
Version 10.0.30319.1
Gadu Gadu: 0
    NieznanyNieznana

Re: Wczytywanie liczby z pliku do zmiennej float.

Nowy postprzez polymorphism » czwartek, 5 marca 2009, 19:32

A nie możesz po prostu:
Kod: Zaznacz cały
StringGrid1->Cells[3][licz + 1] = AnsiString().sprintf("%.2f", Grupa.kurs_k[licz]);
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2157
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 19
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    NieznanyNieznana

Re: Wczytywanie liczby z pliku do zmiennej float.

Nowy postprzez GoldWolf » czwartek, 5 marca 2009, 20:21

Wpadłem na coś innego, ale robiącego to samo :

Kod: Zaznacz cały
StringGrid1->Cells[1][licz + 1] = FormatFloat("0.00", kurs[licz]);
Tylko dwie rzeczy są nieskończone: wszechświat oraz ludzka głupota, choć nie jestem pewien co do tej pierwszej. - Albert Einstein

Błędów nie popełnia ten, kto nic nie robi. - Theodore Roosevelt
Avatar użytkownika
GoldWolf
Homos antropiczny
Homos antropiczny
 
Posty: 116
Dołączył(a): piątek, 16 stycznia 2009, 18:42
Podziękował : 8
Otrzymał podziękowań: 0
System operacyjny: Siódemka Profesjonalna
Kompilator: Microsoft Visual Studio 2010
Version 10.0.30319.1
Gadu Gadu: 0
    NieznanyNieznana


  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Ogólne problemy z programowaniem

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 17 gości

cron