• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

zapis dobry a zły

Object Storage Arubacloud
0 głosów
243 wizyt
pytanie zadane 22 stycznia 2016 w C i C++ przez niezalogowany

Witam, mam kolejny (niestety) problem z Builderem i nie mam pojęcia co robię źle. Bo zapisuje dobrze, a jednocześnie źle. Bo przy odczycie mam mieć np 0,02 a zapisuje mi 0.02 i tutaj jest właśnie problem. Daję fragment kodu:

Zapisu
 

fstream plik;

    plik.open("baza/bezpiecznik.txt", ios::out);
    for(unsigned int i=0; i<B.size(); i++)
    {
        VKomponent= &B[i];
	plik<<VKomponent->return1()<<endl;
	plik<<VKomponent->return2()<<endl;
	plik<<VKomponent->return5().c_str()<<endl;
    }
    plik.close();

Klasy Bezpiecznik .h
 

#ifndef BEZPIECZNIK_H_INCLUDED
#define BEZPIECZNIK_H_INCLUDED

#include "Komponent.h"
#include <vcl.h>

class Bezpiecznik :public Komponent
{
public:
    //potrzebne
    Bezpiecznik(double=250,double=20,AnsiString="szybki");

    virtual double return1();
    virtual double return2();
    virtual AnsiString return5();

    virtual double return3()
    {
        return 0;
    }
    virtual double return4()
    {
        return 0;
    }

    virtual AnsiString return6()
    {
        return "";
    }

private:
    double napiecie;//maksymalne napiecie
    double prad;//maksymalny prad
    AnsiString typ;//typ bezpiecznika(szybki itp)
};
#endif // BEZPIECZNIK_H_INCLUDED

i klasa Bezpiecznik .cpp
 

#include "bezpiecznik.h"

Bezpiecznik::Bezpiecznik(double nap, double amper,AnsiString type)
{
    napiecie=nap;
    prad=amper;
    typ=type;
}

double Bezpiecznik::return1()
{
    return napiecie;
}

double Bezpiecznik::return2()
{
    return prad;
}

AnsiString Bezpiecznik::return5()
{
    return typ;
}

i fragment kodu odpowiedzialnego za odczyt:
 

fstream plik;//deklaracja zmiennej plikowej
	string linia;
	AnsiString zmienna[5];

	plik.open("baza/bezpiecznik.txt", ios::in);
	if(plik.is_open())
	{
	    //string linia;
	    int nr_linia=1;
	    while(getline(plik,linia))
	    {
                switch(nr_linia)
		{
		case 1:
		    zmienna[0]=linia.c_str();
		    break;
		case 2:
		    zmienna[1]=linia.c_str();
		    break;
                case 3:
		    zmienna[2]=linia.c_str();
		}
		nr_linia++;
		if(nr_linia==4)
		{
		    nr_linia=1;
		    B.push_back(Bezpiecznik(zmienna[0].ToDouble(),zmienna[1].ToDouble(),zmienna[2]));
		}
	    }//while
        }//if
        //koniec bezpiecznika
        plik.close();
        plik.clear();



 

3 odpowiedzi

0 głosów
odpowiedź 22 stycznia 2016 przez Radfler VIP (101,030 p.)
wybrane 23 stycznia 2016
 
Najlepsza

Może użyj biblioteki <locale> i aspektu std::numpunct:

#include <cmath>
#include <iostream>
#include <locale>

class CommaPutter : public std::numpunct<char> {

protected:

	char do_decimal_point() const override {
		return ','; // Zwracamy znak, który będzie separatorem dziesiętnym
	}

};

int main() {
	
	// Zamiast cout możemy podać strumień, na którym aktualnie pracujemy
	std::cout.imbue(std::locale(std::cout.getloc(), new CommaPutter()));

	std::cout << std::acos(-1.0) << '\n';
	std::cin.get();

}
komentarz 23 stycznia 2016 przez niezalogowany
Dzięki wielkie za pomoc :) Ciekaw jestem tylko czy da się uzyskać ten efekt nie używając klas??
komentarz 23 stycznia 2016 przez niezalogowany

no dobra, w konsoli to działa ale w Builder C++ 6 nie a dokładnie nie działa to: const override

komentarz 23 stycznia 2016 przez Radfler VIP (101,030 p.)
Usuń override, pewnie builder tego nie wspiera.
komentarz 23 stycznia 2016 przez niezalogowany

no dobra, wyświetla mi się taki komunikat:
[C++ Warning] Unit1.cpp(64): W8022 'CommaPutter::do_decimal_point()' hides virtual function 'numpunct<char>::do_decimal_point() const'

Kolejna sprawa to teraz kod wygląda następująco
 

fstream plik;

    plik.open("baza/bezpiecznik.txt", ios::out);
    plik.imbue(std::locale(plik.getloc(), new CommaPutter()));
    for(unsigned int i=0; i<B.size(); i++)
    {
	VKomponent= &B[i];
	plik<<VKomponent->return1()<<endl;
	plik<<VKomponent->return2()<<endl;
	plik<<VKomponent->return5().c_str()<<endl;
    }
    plik.close();

i kurde nie działa

komentarz 23 stycznia 2016 przez Radfler VIP (101,030 p.)
Po co usuwałeś const? To jest akurat potrzebne...
1
komentarz 23 stycznia 2016 przez niezalogowany
Człowieku, jesteś chyba bogiem. Dziękuję za pomoc :)
0 głosów
odpowiedź 22 stycznia 2016 przez Michał Kopaczewski Użytkownik (870 p.)
http://stackoverflow.com/questions/1422151/how-to-print-a-double-with-a-comma
problem jest w opcjach regionalnych. Ty zapisujesz kropkę a windows widzi przecinek. Spróbuj na poczatku zamienić double na stringa i potem go wpisać do pliku.
0 głosów
odpowiedź 23 stycznia 2016 przez jeremus Maniak (59,720 p.)

możesz użyć zmiennej

DecimalSeparator='.'; // lub ','   - w zależności od potrzeby przed operacjami wczytania lub zapisu double

 

Podobne pytania

+1 głos
2 odpowiedzi 213 wizyt
pytanie zadane 19 lipca 2017 w Offtop przez piotr432 Użytkownik (620 p.)
–1 głos
1 odpowiedź 115 wizyt
0 głosów
1 odpowiedź 203 wizyt

92,576 zapytań

141,426 odpowiedzi

319,652 komentarzy

61,961 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...