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

Konwersja unsigned char, int na stringa

Object Storage Arubacloud
0 głosów
843 wizyt
pytanie zadane 11 września 2016 w C i C++ przez rubiikk Obywatel (1,900 p.)

Cześć, mógłby ktoś mi wytłumaczyć, jak przekonwertować zmienną age (unsigned char) oraz phone_number (unsigned int) na stringa? Mam problem z zapisaniem danych do pliku tekstowego.

 

case 2:
            {
                std::string name, surname;
                unsigned char age;
                unsigned int phone_number;

                std::cout << "Podaj imie: ";
                std::cin >> name;
                std::cout << "Podaj nazwisko: ";
                std::cin >> surname;
                std::cout << "Podaj wiek: ";
                std::cin >> age;
                std::cout << "Podaj numer telefonu: ";
                std::cin >> phone_number;

                std::fstream file;
                file.open("patient.txt", std::ios::app | std::ios::out);
                    if(file.good() == false)
                    {
                        std::cout << "Ten plik nie istnieje - blad.";
                        return 0;
                    }

                file << "\n" << name << "\n";
                file << surname << "\n";
                file << age << "\n";
                file << phone_number << "\n";

                file.close();

            }

 

1
komentarz 11 września 2016 przez niezalogowany
Działa jak powinno. Chociaż na pewno zmienna age nie powinna być typu char. Podanie więcej niż jednego znaku spowoduje błędy np pominięcie kilku instrukcji...
komentarz 11 września 2016 przez criss Mędrzec (172,590 p.)

Nie potrzebujesz konwertować na stringa, że zapisać do pliku. Ale jeśli już, to std::to_string

komentarz 12 września 2016 przez rubiikk Obywatel (1,900 p.)
No właśnie zauważyłem. To jest wina zmiennej typu char?
komentarz 12 września 2016 przez draghan VIP (106,230 p.)
edycja 12 września 2016 przez draghan

Chociaż na pewno zmienna age nie powinna być typu char. 

Poproszę powód (jeśli chodzi Ci o unsigned char).

komentarz 12 września 2016 przez niezalogowany
1. Do zmiennej char można za pomocą cin wczytać tylko jeden znak. Podanie wartości większej niż 9 np. 22 spowoduje błędy. Można by zrobić tablice dwuelementową tylko po co? Nie rozwiąże to wszystkich problemów.

2. Operacje matematyczne będą trudniejsze na takiej zmiennej. Gdy użytkownik poda wartość 1 to w zmiennej zapisze się 49. Trzeba by często używać konwersji. Trudniej będzie sprawdzić czy wiek nie jest zbyt duży np 200

3. Można by wczytać cin liczbę typu int (lub unsigned int) i wrzucić ją do chara... Wtedy powyższe problemy się rozwiążą. Tu można przy okazji też łatwo sprawdzić czy użytkownik nie podał litery...

Tylko znowu - po co? Czy nie lepiej od samego początku używać int, albo short? Można łatwiej warunki okodować i operacje matematyczne będą prostsze. Jeżeli koniecznie chce się małe liczby zapisywać w zmiennej unsigned char to trzeba sobie zadać pytanie czy to na pewno jest opłacalne? Czy jest to bardzo potrzebne? Zazwyczaj nie.
2
komentarz 13 września 2016 przez draghan VIP (106,230 p.)
Podstawowym zadaniem programisty przy projektowaniu systemu, jest dobranie odpowiedniego typu danych do reprezentacji symulowanego fragmentu rzeczywistości.

Przeglądając wbudowane typy danych języka C++ można dojść do wniosku (i mam nadzieję, że tu się ze mną zgodzisz) że najodpowiedniejszym zakresowo typem danych dla ludzkiego wieku jest typ unsigned char, który może przechować wartości z zakresu <0; 255>. Większych liczb nie potrzebujemy, zaś węższy zakresem jest jedynie typ bool, który nijak nie pasuje do poruszanego problemu (chyba żeby zaznaczyć, czy pacjent jeszcze żyje).
Typ signed char jest tu oczywistym nieporozumieniem - nie dość, że niepotrzebne są tutaj wartości ujemne, to jeszcze zakres z góry ograniczony jest do 127, co skutecznie demotywuje ludzi do bicia rekordów długowieczności.
Jedyny mankament wyboru unsigned char to operatory strumieni, które interpretują domyślnie ten typ jako znakowy. Ale od tego są rzutowania, żeby ich używać.

Inne typy całkowite również nie byłby aż takie złe... jednak przyznaj, że liczba 32767 nijak się ma do wieku istoty ludzkiej.
komentarz 13 września 2016 przez criss Mędrzec (172,590 p.)
To już dla świętego spokoju przy cout-ach bym brał inta. Bez przesady, żeby żałować 3B pamięci.
1
komentarz 13 września 2016 przez draghan VIP (106,230 p.)
W zastosowaniu domowym - pewnie że to jest niepotrzebne. Pisząc poważną aplikację należy starać się ograniczać do minimum zajmowane zasoby (jedna zmienna to 3B, ale milion zmiennych to już 3 miliony bajtów).

A skoro jest taka możliwość (i to tania możliwość), to dlaczego z niej nie skorzystać?
1
komentarz 13 września 2016 przez niezalogowany
Jestem przy zdaniu, że zawsze należy sobie zadawać pytanie czy coś jest potrzebne. Podczas nauki i w zastosowaniu domowym takim jakie mamy w tym temacie... nie jest. Zamiast za każdym razem walczyć o 3 bajty możemy się uczyć wielu innych ciekawszych technik :) Gdy zajdzie potrzeba poważnej pracy z dużą ilością danych to wtedy można sobie znów zadać pytanie. Albo gdy programuje się jakieś urządzenie, które ma bardzo mało pamięci...
2
komentarz 13 września 2016 przez draghan VIP (106,230 p.)

Jestem przy zdaniu, że zawsze należy sobie zadawać pytanie czy coś jest potrzebne. 

Okej. To czy zmienna, mogąca pomieścić grube miliony jest potrzebna do określenia wieku człowieka? ;)

Pomimo "przymrużenia oka" i wskazania wyżej że oszczędzanie pamięci w warunkach domowych jest niepotrzebne (tak mi się wydaje, że nie powinienem był jednak tego robić) uważam, że wybiórcze stosowanie pewnych zasad w zależności od okoliczności jest co najmniej niepoprawne. Zawsze powinno się pisać dobry kod i dobre aplikacje. A już szczególnie w okresie nauki.

Ale z mieczem stał nad wszystkimi nie będę. Do whatever you want, then cry and correct it.

2 odpowiedzi

0 głosów
odpowiedź 11 września 2016 przez draghan VIP (106,230 p.)
Po prostu wrzuć zmienną liczbową w strumień pliku operatorem << i zobacz co się stanie.
0 głosów
odpowiedź 11 września 2016 przez Radekol Bywalec (2,880 p.)
Może użyj funkcji atoi?
komentarz 12 września 2016 przez bartolinciu Dyskutant (7,580 p.)
atoi działa inaczej, konwertuje char* do int
komentarz 13 września 2016 przez Radekol Bywalec (2,880 p.)
Oj no tak moje niedopatrzenie...

Podobne pytania

0 głosów
1 odpowiedź 698 wizyt
pytanie zadane 1 listopada 2016 w C i C++ przez Kasztan Dyskutant (8,080 p.)
0 głosów
2 odpowiedzi 6,360 wizyt
pytanie zadane 9 czerwca 2016 w C i C++ przez Mavimix Dyskutant (8,390 p.)
0 głosów
6 odpowiedzi 1,926 wizyt
pytanie zadane 20 sierpnia 2015 w C i C++ przez Jonki Dyskutant (8,180 p.)

92,572 zapytań

141,422 odpowiedzi

319,643 komentarzy

61,959 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!

...