Hypercell ein ] Hypercell aus ] Zeige Navigation ] Verstecke Navigation ]
c++.de  
   

Die mobilen Seiten von c++.de:
http://m.c-plusplus.de
Infos hier [BETA]

  
c++.de :: C++ (auch C++0x und C++11) ::  explode (aus PHP) in C++, bzw. lange Variable unterteilen  
Gehen Sie zu Seite 1, 2  Weiter
  Zeige alle Beiträge auf einer Seite
Auf Beitrag antworten
Autor Nachricht
JanK411
Mitglied

Benutzerprofil
Anmeldungsdatum: 09.01.2012
Beiträge: 24
Beitrag JanK411 Mitglied 17:24:19 18.06.2012   Titel:   explode (aus PHP) in C++, bzw. lange Variable unterteilen            Zitieren

Hallo Leute,

ich möchte aus einer langen Variable, die in einer Textdatei gespeichert ist, mehrere kleine machen.
Der Inhalt der Datei sieht folgendermaßen aus:
Code:
0|test|123|Hello world|18.6.2012;
1|variable|456|Hallo Welt|18.6.2012;

in PHP geht das ganze ja per "explode".
PHP:
$items = explode(";", $content);
//content ist der Inhalt der Textdatei, der ausgelesen wird
 
list($check, $var, $zahl, $text, $date) = explode("|", $item);


Ist das auch in C++ umsetzbar??
wxSkip
Mitglied

Benutzerprofil
Anmeldungsdatum: 16.11.2009
Beiträge: 1985
Beitrag wxSkip Mitglied 17:52:04 18.06.2012   Titel:              Zitieren

Natürlich ist das in C++ umsetzbar. Man muss sich halt eine entsprechende Funktion dafür schreiben.

_________________
Je mehr Käse, desto mehr Löcher. Je mehr Löcher, desto weniger Käse. Also: Je mehr Käse, desto weniger Käse!
Swordfish
Mitglied

Benutzerprofil
Anmeldungsdatum: 27.03.2005
Beiträge: 4176
Beitrag Swordfish Mitglied 18:07:59 18.06.2012   Titel:              Zitieren

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#include <iostream>
#include <string>
#include <sstream>
#include <algorithm>
#include <iterator>
#include <vector>
 
namespace my {
    struct actype : std::ctype< char > {
        actype(): std::ctype< char >(get_table()) {}
        static std::ctype_base::mask const* get_table() {
            static std::ctype_base::mask* rc = 0;
 
            if( !rc ) {
                rc = new std::ctype_base::mask[std::ctype<char>::table_size];
                std::fill_n(rc, std::ctype<char>::table_size,
                std::ctype_base::mask());
                rc['|']  = std::ctype_base::space;
                rc['\n'] = std::ctype_base::space;
            }
            return rc;
        }
    };
   
    std::vector< std::string > split( std::string input )
    {
        std::istringstream iss( input );
        iss.imbue(std::locale(std::locale(), new my::actype));
       
        std::vector<std::string> tokens;
        std::copy(std::istream_iterator<std::string>(iss), std::istream_iterator<std::string>(), std::back_inserter<std::vector<std::string> >(tokens));
 
        return tokens;
    }
}
 
int main() {
   
    std::vector< std::string > tokens = my::split( "0|test|123|Hello world|18.6.2012" );
 
    for( std::vector<std::string>::iterator i = tokens.begin(); i!= tokens.end(); ++i ) {
        std::cout << *i << '\n';
    }
}
wxSkip
Mitglied

Benutzerprofil
Anmeldungsdatum: 16.11.2009
Beiträge: 1985
Beitrag wxSkip Mitglied 18:20:40 18.06.2012   Titel:              Zitieren

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#include <vector>
#include <string>
 
template<typename T> bool DefaultCompareFunc(T const &first, T const &second)
{
    return first == second;
}
 
template<typename T, template<typename T, typename...> class Container, typename FuncType>
    std::vector<Container<T> > GetSeparated(Container<T> const &in, T comp_value, FuncType comp_func)
{
    std::vector<Container<T> > ret;
 
    typename Container<T>::const_iterator start_iter = in.begin(), end_iter = in.begin();
    while(end_iter != in.end())
    {
        if(comp_func(*end_iter, comp_value))
        {
            if(start_iter != end_iter)
            {
                ret.push_back(Container<T>(start_iter, end_iter));
            }
            start_iter = end_iter;
            ++start_iter;
        }
        ++end_iter;
    }
    if(start_iter != end_iter)
    {
        ret.push_back(Container<T>(start_iter, end_iter));
    }
 
    return ret;
}
 
template<typename T, template<typename T, typename...> class Container>
    std::vector<Container<T> > GetSeparated(Container<T> const &in, T comp_value)
{
    return GetSeparated(in, comp_value, DefaultCompareFunc<T>);
}
 
int main()
{
    std::string content = "0|test|123|Hello world|18.6.2012;\n1|variable|456|Hallo Welt|18.6.2012;";    
    std::vector<std::vector<std::string> > tokens;
   
    std::vector<std::string> items = GetSeparated(content, ';');
    for(int i = 0; i < items.size(); ++i)
    {
        tokens.push_back(GetSeparated(items[i], '|'));
    }
}

_________________
Je mehr Käse, desto mehr Löcher. Je mehr Löcher, desto weniger Käse. Also: Je mehr Käse, desto weniger Käse!


Zuletzt bearbeitet von wxSkip am 21:37:22 18.06.2012, insgesamt 2-mal bearbeitet
Swordfish
Mitglied

Benutzerprofil
Anmeldungsdatum: 27.03.2005
Beiträge: 4176
Beitrag Swordfish Mitglied 18:22:28 18.06.2012   Titel:              Zitieren

elogant ;)
Kellerautomat
Mitglied

Benutzerprofil
Anmeldungsdatum: 03.06.2012
Beiträge: 902
Beitrag Kellerautomat Mitglied 01:55:29 19.06.2012   Titel:              Zitieren

:eek:
C++:
1
2
3
4
5
6
7
8
9
10
std::vector<std::string> split(std::string s, char delim)
{
    std::istringstream iss(std::move(s));
    std::vector<std::string> result;
 
    while(std::getline(iss, s, delim))
        result.push_back(std::move(s));
 
    return result;    
}
JanK411
Mitglied

Benutzerprofil
Anmeldungsdatum: 09.01.2012
Beiträge: 24
Beitrag JanK411 Mitglied 17:48:17 19.06.2012   Titel:              Zitieren

Oha
Danke!
Damit muss ich mich erstmal auseinandersetzen.
ist n bisschen mehr als ich erwartet habe ;)

LG


Zuletzt bearbeitet von JanK411 am 17:49:10 19.06.2012, insgesamt 1-mal bearbeitet
JanK411
Mitglied

Benutzerprofil
Anmeldungsdatum: 09.01.2012
Beiträge: 24
Beitrag JanK411 Mitglied 21:14:48 19.06.2012   Titel:              Zitieren

soo
jetzt habe ich mich damit auseinandergesetzt...
und ich verstehe so ziemlich gar nichts ;)

Egal wie ich den Script von wxSkip in meinen hereineditiere, bekomme ich tausende Fehlermeldungen.

Der von Swordfish funktioniert so weit. Aber ich kann nicht genau nachvollziehen wie.
Sind die Werte aus meiner Datei
Code:
0|test|123|Hello world|18.6.2012;

alle in dem Vector "tokens" abgespeichert?
und wie kann ich dann mit diesen Werten weiterarbeiten?
Ich kann den Code insgesamt nicht ganz nachvollziehen.

Ich bin eigentlich auch noch ein blutiger Anfänger, was C++ angeht... ;)
jhkjhkhj
Unregistrierter




Beitrag jhkjhkhj Unregistrierter 21:23:48 19.06.2012   Titel:              Zitieren

Ja, sie sind in tokens gespeichert. Du kannst tokens wie ein Array verwenden.
C++:
tokens[0] // erste Element
tokens[1] // zweite Element
 
tokens.size() // Anzahl der Elemente


Sprich folgendes macht genau das gleiche:
C++:
for (int i = 0; i < tokens.size(); ++i)
{
 std::cout << tokens[i] << "\n";
}
wxSkip
Mitglied

Benutzerprofil
Anmeldungsdatum: 16.11.2009
Beiträge: 1985
Beitrag wxSkip Mitglied 21:55:04 19.06.2012   Titel:              Zitieren

JanK411 schrieb:

Egal wie ich den Script von wxSkip in meinen hereineditiere, bekomme ich tausende Fehlermeldungen.

Welche? Welchen Compiler hast du?

_________________
Je mehr Käse, desto mehr Löcher. Je mehr Löcher, desto weniger Käse. Also: Je mehr Käse, desto weniger Käse!
c++.de :: C++ (auch C++0x und C++11) ::  explode (aus PHP) in C++, bzw. lange Variable unterteilen  
Gehen Sie zu Seite 1, 2  Weiter
Auf Beitrag antworten

Zeige alle Beiträge auf einer Seite




Nächstes Thema anzeigen
Vorheriges Thema anzeigen
Sie können Beiträge in dieses Forum schreiben.
Sie können auf Beiträge in diesem Forum antworten.
Sie können Ihre Beiträge in diesem Forum nicht bearbeiten.
Sie können Ihre Beiträge in diesem Forum nicht löschen.
Sie können an Umfragen in diesem Forum nicht mitmachen.

Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme

c++.de ist Teilnehmer des Partnerprogramms von Amazon Europe S.à.r.l. und Partner des Werbeprogramms, das zur Bereitstellung eines Mediums für Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu amazon.de Werbekostenerstattung verdient werden kann.

Die Vervielfältigung der auf den Seiten www.c-plusplus.de, www.c-plusplus.info und www.c-plusplus.net enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt (vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden. Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.