| Autor |
Nachricht |
JanK411
Mitglied
Benutzerprofil
Anmeldungsdatum: 09.01.2012
Beiträge: 24
|
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
|
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
|
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
|
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
|
Swordfish Mitglied
18:22:28 18.06.2012 Titel: |
|
Zitieren |
elogant |
|
|
|
 |
Kellerautomat
Mitglied
Benutzerprofil
Anmeldungsdatum: 03.06.2012
Beiträge: 902
|
Kellerautomat Mitglied
01:55:29 19.06.2012 Titel: |
|
Zitieren |
| 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
|
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
|
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
|
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
|
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!
|
|
 |
|
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.
|
|
|
|
|