Nowe posty

xx Problem ze sterownikami. (5)
2024-04-13, 21:25:16
xx Instalacja xfce4 (2)
2024-04-13, 16:20:17
xx Serie kompilacji bez instalacji dla “emerge” w Gentoo (2)
2024-04-08, 18:40:04
xx Plasma 6 w Neonie ssie trochę mniej ... (17)
2024-04-05, 10:03:46
xx Problem z Linux Lite po instalacji (3)
2024-04-03, 14:23:40
xx Jak właczyć num locka przy starcie systemu debian 12? (12)
2024-04-02, 17:43:54
xx Brak dźwieku w systemie. (5)
2024-04-02, 16:13:41
xx Dystrybucja pod HP Omen (7)
2024-03-29, 11:33:05
xx [Poradnik] Wyszukiwanie Sterowników (2)
2024-03-27, 21:08:23
xx Ile pingwinów? (1)
2024-03-27, 08:59:24

Autor Wątek: string nie chce połączyć łancucha  (Przeczytany 1723 razy)

KelThuzad

  • Gość
string nie chce połączyć łancucha
« dnia: 2016-09-19, 16:49:54 »
Witam mam problem z połączeniem stringa.
#include "my_file.h"
#include "transactions.h"
#include "date.h"
#include <iostream>
#include <fstream>                                                      //DO KORZYSTANIA Z PLIKOW
#include <iomanip>                                                      //DO SETPRECISION
#include <stdexcept>                                                    //OBSLUGA BLEDOW
#include <string>
int main()
{
    my_file file( "dane.txt" );
    if ( file.is_file_opened() )
    {
        std::cerr << "Plik nie istnieje" << std::endl;
        std::exit ( EXIT_FAILURE );                                     //KONCZY PROGRAM
        //        return 1;
    }
    if ( file.is_file_empty() )
    {
        std::cerr << "Plik jest pusty" << std::endl;
        std::exit ( EXIT_FAILURE );                                     //KONCZY PROGRAM
        //        return 1;
    }
    //    std::string mm = file.add_budget() ;
    //    std::cout << "budrzet ma : " << mm << std::endl;
    double budget = {};
    //    std::cout << "budzet wynosi: " << budget << std::endl;
    try
    {
        budget = std::stod( file.add_budget() );
    }
    catch ( const std::invalid_argument&)
    {
        std::cerr << "Dane w pliku nie są liczbami" << std::endl;
        std::exit ( EXIT_FAILURE );                                     //KONCZY PROGRAM
    }

    std::cout << "budzet na starcie wynosi: " << std::setprecision(5) << budget << std::endl;
    //    budget = budget - 33.22;
    //    std::cout << "budget" << budget << std::endl;
    transactions choice_of_payment;
    date day_payment , mount_payment , year_payment ;
    int day , mount , year ;
    double payment = {};
    char answer = {};
    std::string date_final = {};
    do
    {
        char choice = choice_of_payment.selec_cash_card_or_payment();
        if ( choice == '1' )
        {
            std::cout << "Wybrales\aa zaplate przez gotowke" << std::endl;
            std::cout << "Podaj date w ktorym zaplaciles\as gotowka" << std::endl;
            day = day_payment.day();
            mount = mount_payment.mount();
            year = year_payment.year();
            std::cout << day << " " << mount << " " << year << std::endl;
            date_final = day + "-" + mount + "-" + year;
            std::cout << date_final << std::endl;
        }
        else if ( choice == '2' )
        {
            std::cout << "Wybrales\as zaplate przez carte bankowa" << std::endl;
        }
        else if ( choice == '3' )
        {
            std::cout << "Wybrales\as wplate gotowki na konto" << std::endl;
            payment = choice_of_payment.payment_cash_to_card();
//            std::cout << "To jest ile chcesz wplacic: " << payment << std::endl;
            budget += payment;
            std::cout << "Wplaciles/as na konto: " << payment << " teraz na koncie masz: " << budget << std::endl;
            do
            {
                std::cout << "Czy chce zakonczyc program, jezeli tak to wpisz Y - yes" << std::endl;
                std::cout << "Jezeli nie chcesz zakonczyc to napisz N - no" << std::endl;
                std::cin >> answer;
            }
            while ( !((answer == 'Y' || answer == 'y') || (answer == 'N' || answer == 'n') ));

        }
        else
        {
            std::cerr << "Wybrales\as zla opcje" << std::endl;
            /*do
            {
                std::cout << "Czy chce zakonczyc program, jezeli tak to wpisz Y - yes" << std::endl;
                std::cout << "Jezeli nie chcesz zakonczyc to napisz N - no" << std::endl;
                std::cin >> answer;
            }
            while ( !((answer == 'Y' || answer == 'y') || (answer == 'N' || answer == 'n') ));
            */
        }
    }
    while ( !( answer == 'Y' || answer == 'y' ) );

    return 0;
}
w tym kodzie chodzi mi o część:
std::cout << "Wybrales\aa zaplate przez gotowke" << std::endl;
            std::cout << "Podaj date w ktorym zaplaciles\as gotowka" << std::endl;
            day = day_payment.day();
            mount = mount_payment.mount();
            year = year_payment.year();
            std::cout << day << " " << mount << " " << year << std::endl;
            date_final = day + "-" + mount + "-" + year;
            std::cout << date_final << std::endl;
date.cpp wyglada tak:
#include "date.h"
#include <iostream>

date::date()
{

}
//======================================================================
int date::day()
{
    int day;
    std::cout << "Podaj dzień: ";
    std::cin >> day;
    if ( day >= 1 && day <= 31 )
    {
        std::cout << "twoj dzien to: " << day << std::endl;
        return day;
    }
    else
    {
        std::cerr << "Podales\as zlu dzien";
    }
}
//========================================================================
int date::mount()
{
    int mount;
    std::cout << "Podaj miesiac: ";
    std::cin >> mount;
    if ( mount >= 1 && mount <= 12 )
    {
        std::cout << "Twoj miesiac to: " << mount << std::endl;
        return mount;
    }
    else
    {
        std::cerr << "Podales\as zly miesiac" << std::endl;
    }
}
//=========================================================================
int date::year()
{
    int year;
    std::cout << "Podaj rok: ";
    std::cin >> year;
    if ( year > 2015 )
    {
        std::cout << "Twoj rok to: " << year << std::endl;
        return year;
    }
    else
    {
        std::cerr << "Podales\as zly rok";
    }
}
a date.h
#ifndef DATE_H
#define DATE_H


class date
{
public:
    date();
    int day();
    int mount();
    int year();
};

#endif // DATE_H
I nie wiem czemu string nie chce działać(date_final = day + "-" + mount + "-" + year;)? Przecież tak się dodaje do stringa

Offline Paweł Kraszewski

  • Administrator
  • Guru
  • *****
  • Wiadomości: 3056
  • Lenistwo jest matką potrzeby = babcią wynalazku
    • Zobacz profil
Odp: string nie chce połączyć łancucha
« Odpowiedź #1 dnia: 2016-09-19, 20:08:38 »
Bo to są INT-y, a ich nie da się dodać do stringów... Ile miałoby się równać 8+"piw" ?

Możesz:
a) Użyć sprintf-a, ale to brzydkie i nieC++owe.
b) Użyć strumienia łańcuchów std::stringstream:

#include <sstream>
#include <iostream>

[...]

/* Pusty stringbuffer */
std::stringstream date_final;

[...]

/* Pakujemy do niego dane. Obowiązują takie same zasady jak przy std::cout */
date_final << day << "-" << mount << "-" << year;

/* Metoda .str() wyciąga z niego wszystkie dane naraz jako std::string */
std::cout << date_final.str() << std::endl;

PS. mount to góra albo wspinać się. Miesiąc to month.
Paweł Kraszewski
~Arch/Void/Gentoo/FreeBSD/OpenBSD/Specjalizowane customy

KelThuzad

  • Gość
Odp: string nie chce połączyć łancucha
« Odpowiedź #2 dnia: 2016-09-20, 15:49:20 »
A jeszcze mam pytanie Paweł co do tej metody czy później da się coś takiego wsadzić do pliku?

I dzięki że wskazałeś mi tą górę :D ale głupi błąd.
« Ostatnia zmiana: 2016-09-20, 15:56:40 wysłana przez MateuszA »

Offline Paweł Kraszewski

  • Administrator
  • Guru
  • *****
  • Wiadomości: 3056
  • Lenistwo jest matką potrzeby = babcią wynalazku
    • Zobacz profil
Odp: string nie chce połączyć łancucha
« Odpowiedź #3 dnia: 2016-09-20, 19:22:25 »
A jeszcze mam pytanie Paweł co do tej metody czy później da się coś takiego wsadzić do pliku?

Otwierasz plik jako strumień i jazda... Metodzie << obojętne czy wywala do std::cout czy do pliku, jeżeli dobrze rozumiem pytanie.

Ewentualnie std::copy_n:


std::copy_n( istreambuf_iterator<char>(strumień_wejściowy),
        100, /* Rozmiar bufora */
        ostreambuf_iterator<char>(strumień_wyjściowy)
);
I dzięki że wskazałeś mi tą górę :D ale głupi błąd.
Nie myli się tylko ten, co nic nie robi. Ja też kiedyś u okulisty czytam rządek: AAA EEE YYY UUU a lekarka "proszę pana, ale tam są cyfry" ;) Autentyk!
Paweł Kraszewski
~Arch/Void/Gentoo/FreeBSD/OpenBSD/Specjalizowane customy