Elektroda.pl
Elektroda.pl
X

Wyszukiwarki naszych partnerów

Wyszukaj w ofercie 200 tys. produktów TME
Europejski lider sprzedaży techniki i elektroniki.
Proszę, dodaj wyjątek elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[c++] konwersja string do double, strumienie

michallen23 12 Maj 2009 20:33 3024 2
  • #1 12 Maj 2009 20:33
    michallen23
    Poziom 9  

    Witam mam problem ze strumieniami, otoz wpisuje sobie w konosoli ciag znakow [3.43 64.3332 -4.23] pytanie brzmi : jakim sposobem moge wychwycic liczby ze strumienia i zapisac je np w tablicy double zaalokowanej dynamicznie na podstawie tego ile liczb wpisalem ?

  • #2 12 Maj 2009 20:58
    kisiel850
    Poziom 8  

    proponowalbym najpierw uzyc funkcji "gets" aby pobrac stringa do tablicy a nastepnie podzielic stringa funkcja "strtok" (jako element podzialu dac spacje) i wrzucac do tavlicy poszczegolne wartosci

    Moderowany przez Dr.Vee:

    Straszne herezje, mowa jest o C++ a nie o antycznych i niebezpiecznych funkcjach C. Proszę nie udzielać szkodliwych porad.



    nastepnie sa odpowiednie funkcje (string to int, itd itp), odsylam do lektury http://sadi.ovh.org/arty/cppkonw.php

  • #3 13 Maj 2009 00:10
    Dr.Vee
    VIP Zasłużony dla elektroda

    Spróbuj tak:

    Code:
    #include <vector>
    
    #include <ios>
    #include <istream>
    #include <cctype>

    std::istream& operator>>(std::istream& is, std::vector<double> &vd)
    {
        vd.clear();

        char c;
        while (is >> c) {
            if (isspace(c)) {
                // consume whitespace
                continue;
            }
            if (c != '[') {
                // anything except opening brace -> failure
                is.putback(c);
                is.clear(std::ios::failbit);
                return is;
            }
            break;
        }

        // read a list of doubles
        double d;
        while (is >> d) {
            vd.push_back(d);
        }

        // test the state of the stream
        if (is.bad() or is.eof()) {
            // leave as is
        } else {
            // reset stream state
            std::ios::iostate state = is.rdstate();
            is.clear();
            if (is.peek() == ']') {
                // eat up closing brace
                is.ignore();
            } else {
                // otherwise restore stream state
                is.clear(state);
            }
        }

        return is;
    }

    Taka implementacja prawie działa - jedyne co robi źle to akceptuje np. takie wejście jak:
    Code:
    [-]
    jako pusty wektor, tak samo
    Code:
    [1 2 3 -]
    jest parsowane jako [1 2 3]. Jeśli bardzo Ci to przeszkadza, to będziesz musiał parsować tekst wewnątrz nawiasów "ręcznie", np dzieląc na kawałki i parsując każdą liczbę osobno.

    Oczywiście trzeba by było zająć się wyjątkami, ale to już inna sprawa :)

    Pozdrawiam,
    Dr.Vee

 Szukaj w ofercie
Zamknij 
Wyszukaj w ofercie 200 tys. produktów TME