Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » String auswerten (oder Config Parser)

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
13.12.2005, 09:22 Uhr
Moe



Hi!

Ich möchte mit sauberen C++ eine Config-Datei auslesen. Dazu öffne ich sie mit

C++:
ifstream file(config_name);
if(!file){
    cerr << "File " << config_name << " could not be opened" << endl;
    return(FALSE);
}

Dann lade ich die erste Zeile in einen Puffer:

C++:
string buffer;
getline(file, buffer);

Jetzt würde ich gerne in sauberen C++ diesen Puffer analysieren:
- ist es ein Kommentar oder eine Leerzeile? Nächste Zeile.
- Steht am Anfang ein Text? Speicher Zahl nach Text.
- Steht am Anfang eine Zahl? Speicher Ziffer 0-4 als int und 5-8 als int.

In meinem Pseudo-Code sollte das so aussehen:

Code:
if(buffer[0] == " " || buffer[0] == "#")
    getline(file, buffer);
if(buffer.bisZiffer(13) == "DiesIstEinBsp")
    atoi(buffer.ab(14), int_eins);
if(buffer.bisZiffer(4) < 10000)
    atoi(buffer.bis(4), int_zwei);
    atoi(buffer.ab(5)bis(8), int_drei);



Bitte, kann mir jemand helfen? Eigentlich ist es nicht viel, aber weder Google noch zwei Bücher wollen mir helfen

Vielen Dank!
Moe
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
13.12.2005, 10:59 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


guck dir mal die mehtoden find und substr der klasse string an...
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
13.12.2005, 11:49 Uhr
ao

(Operator)


Verwende statt atoi strtol oder strtoul. Die bieten eine bessere Erfolgskontrolle. atoi dreht dir 0 als Ergebnis an, wenn es den String nicht umwandeln konnte, d.h. du siehst keinen Unterschied zwischen atoi ("0") und atoi("schmarrn").

Oder versuch es mit sscanf; wenn du es damit hinkriegst, ist das vermutlich das einfachste.

Wenn du nicht weiterkommst, dann poste doch mal einen Ausschnitt aus deinem Textfile, der alle vorkommenden Fälle enthält.

ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
13.12.2005, 13:18 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


ansonsten, using namespace ist nicht umbedingt sauberes c++
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
13.12.2005, 20:23 Uhr
Moe




Zitat von Windalf:
guck dir mal die mehtoden find und substr der klasse string an...

Super, damit klappt schonmal das Vergleichen!


Zitat von ao:
Verwende statt atoi strtol oder strtoul. Die bieten eine bessere Erfolgskontrolle. atoi dreht dir 0 als Ergebnis an, wenn es den String nicht umwandeln konnte, d.h. du siehst keinen Unterschied zwischen atoi ("0") und atoi("schmarrn").

Ich probiere erstmal mit atoi rum und wenn alles okay ist nehme ich strtol! Danke aber für den Hinweis!
Allerdings scheiter ich noch mit atoi:
atoi(buffer.substr(20)); gibt mir folgenden Fehler zurück:
Fehler: »std::basic_string<char, std::char_traits<char>, std::allocator<char> >« kann nicht nach »const char*« für Argument »1« nach »int atoi(const char*)« umgewandelt werden.
Ich denke das bedeutet, dass atoi nicht mit Strings umgehen kann. Kann strtol das? Oder muss ich das kurz ich in char schreiben?


Zitat von FloSoft:
ansonsten, using namespace ist nicht umbedingt sauberes c++

Das verstehe ich noch nicht ganz. Sollte man std::cin << "bla"; nehmen anstatt nur cin << "bla";? Ich habe das mit dem namespace zwar mal durchgelesen, aber nicht wirklich verstanden. Sorry...

Aber an Alle nochmal ein dickes DANKESCHÖN!!
Moe
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
13.12.2005, 20:34 Uhr
predator



häng an das buffer.substr(20) noch ein .c_str() dran, also:

C++:
atoi(buffer.substr(20).c_str());

--
Gruß
predator
Zitat von Edsger W. Dijkstra:
Es ist praktisch unmöglich, einem Studenten gutes Programmieren beizubringen, wenn er vorher in BASIC programmiert hat. Als potenzielle Programmierer sind sie geistig verstümmelt ohne Hoffnung auf Erholung.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
13.12.2005, 20:37 Uhr
Pler
Einer von Vielen
(Operator)


Ich hab mir auch schon mal gedacht, dass das einfacher gehn muss.
Für Perl gibts zum Beispiel son Modul (ReadConfig.pm oder so), das eine Configdatei auswertet.
In einem Hash kann ich dann auf alle in dem Config-File gesetzten Variablen zugreifen.

Kennt jmd. etwas ähnliches für C?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
14.12.2005, 08:52 Uhr
J-jayz-Z
Perl Crack ala Carte
(Operator)



Zitat von Pler:
Ich hab mir auch schon mal gedacht, dass das einfacher gehn muss.
Für Perl gibts zum Beispiel son Modul (ReadConfig.pm oder so), das eine Configdatei auswertet.
In einem Hash kann ich dann auf alle in dem Config-File gesetzten Variablen zugreifen.

Kennt jmd. etwas ähnliches für C?

Jo, das dachte ich mir auch, das es nicht sein kann, das es so schwer ist in C/C++.
In Perl brauch man dazu IMHO kein Modul, da reicht ja ein:

C++:
while(<FILEHANDLE>) {
my ($config, $value) = split /\s*=\s*/, $_;
}

--
perl -Mstrict -Mwarnings -e 'package blub; sub new { bless {} } sub bar {my $self=shift; $self->{bla}="66756e2d736f66742e6465"; return $self->{bla};} my $foo=blub->new();print "Hallo ";print pack("H*",$foo->bar()); print "\n"'
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
14.12.2005, 10:24 Uhr
Pler
Einer von Vielen
(Operator)



OK. Wieder Punkt an dich und Perl!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
14.12.2005, 21:26 Uhr
J-jayz-Z
Perl Crack ala Carte
(Operator)


Schon wieder?
--
perl -Mstrict -Mwarnings -e 'package blub; sub new { bless {} } sub bar {my $self=shift; $self->{bla}="66756e2d736f66742e6465"; return $self->{bla};} my $foo=blub->new();print "Hallo ";print pack("H*",$foo->bar()); print "\n"'
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: