PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : configdatei auslesen [ c++]



jonasge
01-10-2002, 23:50
Hi,
ich will mit c++ aus einer datei verschiedene Werte auslesen.
Die datei sieht folgendermassen aus:
adresse 192.168.0.1
username jonas

Die Datei kann aber auch so aussehen:
username jonas
adresse 192.168.0.1


Wenn ich dies nur mir fscanf(); mache, kommt das programm natürlich durcheinander, da sich das in
der datei geändert hat, wie kann ich jetzt z.B in der datei nach adresse suchen, und dann soll er die
192.168.0.1 als Wert nehmen ??


Wie geht das ??

Gruss
Jonas

Lin728
02-10-2002, 06:37
Also, ich kann dir nur sagen, wie ich das in Java machen würde:

Zeilenweise einlesen (kann man unter C++ auch simulieren), und dann bei jeder zeile schaun, ob sie auf eine aller möglichen werte zutrifft. Wenn ja, schreibe den wert rein....

Also hier die vorgehenswiese:
1.) Datei einlesen
2.)Den String in lauter zeilen zerlegen (anhand von '\n')
3.)Diesen String wiederum in zewei strings zerlegen. (ab dem ersten leerzeichen)
4.) Dann auf alle möglichen werte prüfen.

Ich weiß, dass ließe sich viel effizienter machen, speziell weil hier viel speicherallocierungen nötg...

anda_skoa
02-10-2002, 10:06
Es geht in etwas so: (nicht getestet)



#include <string>
#include <sstream>
#include <fstream>
#include <map>
#include <iostream>

using namespace std;

int main()
{
map<string, string> config;
string zeile;
ifstream infile("infile.cfg");
while (infile)
{
getline(infile, zeile);
stringstream strstream(zeile);
string key;
string value;
strstream >> key;
strstream >> value;
if (key.length() > 0 && value.length() > 0)
config[key] = value;
}

cout << "Wert von address" << config["address"] << endl;
}


Ciao,
_

jonasge
02-10-2002, 18:12
Hi,
:-)
das klappt schon sehr gut, jedoch die Datei die ich auslesen will, sieht so aus:
Kernel version 2.4.18
Jedoch wenn ich den code von oben nehme, dann kann er das mit den Leerzeichen nicht verwenden .

Wie kann ich das machen das er auch das mit Leerzeichen annimmt.

Gruss
JOnas
p:S
JEde zeile sieht so aus:
Irdenwas: wert
Irdnewas ds: wert
Also es gibt immer ein : vieleicht kann man den benutzen zum Trenne ?

anda_skoa
02-10-2002, 18:40
Wenn : das Trennzeichen ist, dann geht das ein bischen anders.
Statt dem stringstream machst du in etwa



int pos = zeile.find(":");
if (pos > 0) // gefunden nach mindestens einem Zeichen
{
key = zeile.substr(0, pos);
pos++;
value = zeile.substr(pos, zeile.length()-pos);
}


Ciao,
_

jonasge
02-10-2002, 19:12
Hi,
cool vielen dank!
vieleicht noch eins !
Wenn ich printf("\n\Wert: %sn", config[address]);
mache bringt g++ folrgendes:
warning: cannot pass objects of type `basic_string<char,string_char_traits<char>,__default_alloc_template<true,0> >' through `...'
Und dann die ausgabe, da kommt nur müll !
Irgendwie sstehe ich auf dem schlauch


Gruss
Jonas

jonasge
02-10-2002, 21:17
bzw, ich brauche zur weiteren verarbeiten einen char.
wenn ich das mit sprintf(); mache kommt die gleiche fehlermeldung, was mache ich falsch ?

anda_skoa
03-10-2002, 09:47
string ist eine Klasse

Um an einen C String bzw char* zu kommen, hat string eine methode c_str()

Btw, du solltes, wenn nicht nötig nicht mit printf oder sprintf arbeiten.
Mit einem stringstream kannst du auch in einen string schreiben.

Ciao,
_