Strona 2 z 2

Re: StrToInt dla kilku liczb

Nowy postNapisane: poniedziałek, 2 grudnia 2013, 22:11
przez Cyfrowy Baron
polymorphism napisał(a):AnsiString ma zdefiniowane operatory << >> dla strumieni standardowych, dzięki czemu nic nie musisz konwertować.


Niestety u mnie to nie działa, pewnie dlatego, że istringstream oczekuje typu char więc konwersja jest konieczna.

polymorphism napisał(a):To jest zła konstrukcja. Zawartość zwrócona przez c_str jest tylko do odczytu.


Działa, więc nie może być zła.

Re: StrToInt dla kilku liczb

Nowy postNapisane: poniedziałek, 2 grudnia 2013, 22:58
przez polymorphism
Niestety u mnie to nie działa (...)

A zrobiłeś tak, jak jest napisane w dokumentacji? Nie wiem, jak to się ma do nowszych wersji środowiska, bo to co podałem jest dla szóstki.

Działa, więc nie może być zła.

Oczywiście, że może! Trochę w tym siedzisz i powinieneś już wiedzieć, że nie wszystko, co działa w danej chwili, jest dobrze napisane. Szczególnie w C++! To nawet nie powinno się skompilować... no tak, VCL. W dobrze zaimplementowanych bibliotekach c_str zawsze zwraca wskaźnik const (jeśli w ogóle zwraca jakiś wskaźnik), co jednoznacznie oznacza, że zawartość spod tego wskaźnika jest tylko-do-odczytu.

Re: StrToInt dla kilku liczb

Nowy postNapisane: wtorek, 3 grudnia 2013, 05:52
przez Cyfrowy Baron
Wiem o co ci chodzi z c_str(), ale wiem też, że w C++Builder to zawsze działało. Pokaż jak inaczej byś to zrobił ze string lub AnsiString.

Re: StrToInt dla kilku liczb

Nowy postNapisane: wtorek, 3 grudnia 2013, 10:36
przez polymorphism
Pokazywać nie muszę, bo w sumie to już pokazałeś poprawny przykład z std::stringiem. Z AnsiStringiem byłoby tak samo, tylko pozostaje kwestia "odblokowania" operatorów << >>.

(...) w C++Builder to zawsze działało

Czysty przypadek. Zresztą to jest dobry przykład tego, dlaczego const-correctness jest ważne.

Re: StrToInt dla kilku liczb

Nowy postNapisane: wtorek, 3 grudnia 2013, 19:26
przez Cyfrowy Baron
polymorphism napisał(a): Z AnsiStringiem byłoby tak samo, tylko pozostaje kwestia "odblokowania" operatorów << >>.



[BCC32 Error] Unit1.cpp(43): E2094 'operator>>' not implemented in type 'istringstream' for arguments of type 'AnsiString'


Re: StrToInt dla kilku liczb

Nowy postNapisane: wtorek, 3 grudnia 2013, 19:59
przez polymorphism
Zdefiniowałeś VCL_IOSTREAM przed załączeniem pliku dstring.h?

Re: StrToInt dla kilku liczb

Nowy postNapisane: wtorek, 3 grudnia 2013, 20:17
przez Cyfrowy Baron
Gdy to zrobię mogę co prawda użyć operatora >>, ale istringstream wprowadza do zmiennej cały ciąg bez dzielenia na liczy, czyli np. uzyskuję wynik:

1 14 text 19 20

zamiast

1
14
19
20

Re: StrToInt dla kilku liczb

Nowy postNapisane: wtorek, 3 grudnia 2013, 20:42
przez polymorphism
Według źródła sysclass.h dzieje się tak dlatego, ponieważ jakiś niezbyt ogarnięty programator VCL-a dał jako delimiter wartość zero, a powinien być każdy biały znak. Ręce opadają... :zawiedziony:

--- dodane ---

Machnąłem operator dla AnsiStringa, powinien działać jak należy:
KOD cpp:     UKRYJ  
std::istream& operator >> (std::istream& is, AnsiString& arg)
{
        int c;
        char buf[1024 + 1];
        int n = 0;

        arg = "";

        for(; isspace((c = is.rdbuf()->sgetc())) && c != EOF;
                is.rdbuf()->snextc());

        if(c == EOF)
        {
                is.setstate (std::ios_base::failbit);
                return is;
        }

        do
        {
                if(n == 1024)
                {
                        buf[n] = 0;
                        arg += buf;
                        n = 0;
                }

                buf[n++] = (char)c;
        }
        while(!isspace((c = is.rdbuf()->snextc())) && c != EOF);

        if(c == EOF)
                is.setstate (std::ios_base::eofbit);

        if(n > 0)
        {
                buf[n] = 0;
                arg += buf;
        }

        return is;
}