Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Problem mit Vektoren Handling

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.07.2002, 13:27 Uhr
uTaNG



Hallo erstmal, habe Euer Board durch Zufall gefunden und bin ganz beeindruckt. Die Posts sowohl die Antworten waren immer sehr Interessant. Nun bin ich mal dran und habe ein kleines Problem. Ich bin in der Ausbildung zum Datenverarbeiter und immoment ist das Thema Log-Dateinen und Log-verfahren dran.
Ich beschäftige mich seit ca 3-4 Monaten mit der OOP in C++ und möchte ein Programm schreiben das mir hilft Log-Datein besser und übersichtlicher Auszuwerten.

Ich bin in meinem Programm relativ weit nur fehlt mir Sowohl der Lösungsansatz und das Kompetente Wissen mit dem Vektor-Handling.
Habe zwar viele Posts mit der Thematik gelesen und nachvollziehen können,aber anscheined stehe ich auf dem schlauch.

So könnte eine Beispiel-Log von unserem "Lehrmeister" ,) aussehen.

So könnte eine Beispiel-Log von unserem "Lehrmeister" ,) aussehen.


AusbildungsInst:
SBBA34
<Thema> LOG-Dateien
DATUM
23.4.02
URL: www.informatik-Fx.de
OS win2k ADV server
209.183.240.222/Windows System/..
209.183.215.50/Windows/
209.183.197.130/dir/
erstellt mit GthLo
Signatur
datum
Connect from
So ungefähr könnte es ausehen nur weit umfangreicher und 1000x Einträge.

Mein Programm ist wie gesagt OOP und besitzt folgende Methoden:
- Laden
- Anzeigen der geladenen Datei
- speichern der Datei

diese sind Methoden via "Buchstaben" per "switch" aufrufbar ...


Nur fehlt mir:
- die geladene LOG zu konvertieren d.h. es sollen die Zeilen mit der IP und dem DIR raus gesucht werden.
- vor der IP muss der string: "IP:" gesetzt

=> danach könnte ich diese konvertierung speichern und es sollte wie folgt aussehen:


IP:209.183.240.222/Windows System/..
IP:209.183.215.50/Windows/
IP:209.183.197.130/dir/
Vlt. noch zur Hilfe ein paar Fragmente aus dem Program:


// Methode load() zum Laden der Datei
// print() zum Ausgeben der Datei
inline void printline( const Element& el) // Eine Zeile
{
cout << left << el.ip << endl;
}

void loc::print() const // Alle Einträge ausgeben
{
if( count == 0)
cout << "\nDie LOG-Datei ist leer!" << endl;
else
{
for( int i = 0; i < count; ++i)
printline( v[i]);
}
}


bool loc::load()
{
cout << "\n--- LOG aus einer Datei laden. ---"
<< "\nDatei: ";

string file; // Dateiname einlesen
cin.sync(); cin.clear(); // Nur neue Eingabe
getline( cin, file);
if ( file.empty() )
{
cerr << "Kein Dateiname angegeben!" << endl;
return false;
}

// Datei zum Lesen öffnen:

ifstream infile( file.c_str(), ios::in | ios::binary);
if( !infile )
{
cerr << "Datei " << file
<< " konnte nicht geöffnet werden!" << endl;
return false;
}

int i = 0;
while ( i < MAX )
{
getline ( infile, v[i].ip , '\0');
if( !infile)
break;
else
++i;
}
if( i == MAX)
cerr << "Grenze von "<< MAX
<< " Eintraegen erreicht!" << endl;
else if( !infile.eof())
{
cerr << "Fehler beim Lesen der Datei " << file
<< endl;
return false;
}
count = i; // aktuelle Anzahl der Elemente
filename = file;
dirty = false; // true, fals Datein verändert // und noch nicht gespeichert.
return true;
}
Hoffentlich könnt ihr damit etwas anfangen und mir ein bissel weiterhelfen.
Danker erstmal -uTaNG-
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
13.07.2002, 14:28 Uhr
virtual
Sexiest Bit alive
(Operator)


Wenn ichs richtig verstanden habe, willst Du pruefen, ob die Zeiel eine IP Addresse + Pfad darstellt. Und nur in diesem Falle weiterverarbeiten.
Ich wuerde bei dem getline in ewta sowas probieren:

C++:
std::string   str;
std::string  pfad = "";
std::string  ip = "";
std::string::size_type pos;

getline(infile, str);

pos = str.find_first_of("/");
if (pos != std::string::npos)
{
    int ip1, ip2, ip3, ip4;
    // Okay, str enthaelt ein "/"
    pfad = str.substr(pos); // pfad enthaelt nun den Pfadanteil
    // Nun noch pruefen, ob IP Addresse
    if (4==sscanf(str.c_str(), "%d.%d.%d.%d", &ip1, &ip2, &ip3, &ip4))
    {
        // Scheint okay zu sein: da sind 4 Zahlen durch Punkte getrennt.
        // Weitere Pruefungen moeglich
        ip = str.substr(0, pos);
     }
}
// Wenn wir hier ankommen und sowohl pfad alsauch ip nicht leer sind,
// entspricht die Zeile dem geforderten Format


Tschuldige, wenn ich Muell erzaehlt habe, aber anders habe ich Dein Posting nicht verstanden.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
14.07.2002, 09:17 Uhr
Uwe
C/C++ Master
(Administrator)


Hallo,

Zitat:
uTaNG postete
Ich bin in meinem Programm relativ weit nur fehlt mir Sowohl der Lösungsansatz ...

Der ist nicht schlecht...
Wie virtual schon schrieb: wo genau ist nun Dein Problem?
--
"Es ist schwierig, ein Programm wirklich idiotensicher zu machen, weil Idioten so genial sind."

Bis dann...
Uwe

Dieser Post wurde am 14.07.2002 um 09:18 Uhr von Uwe editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
14.07.2002, 16:59 Uhr
~uTaNG
Gast


hallo,das ist genau das was ich brauche ! Nur die reine Sortierung !!! Danke sehr!

Ich bräuchte vlt. nur noch n bissel Hilfe beim Implementieren.
Meine Methode zum Anzeigen der geladenen Datei sieht so aus:

C++:
inline void printline( const Element& el)    // Eine Zeile
{
   cout << left << el.ip << endl;
}

void Log::print() const     // Alle Einträge ausgeben
{
   if( count == 0)
      cout << "\nDie LoG ist leer!" << endl;
   else
   {
          for( int i = 0; i < count; ++i)
          printline( v[i]);
   }
}



Bemerkung:
Für das Laden und Speichern habe ich bereits funktionierende Methoden geschrieben. Es soll nur noch eine Methode erstellt werden die mir diese Sortieren erledigt und die Zeilen dann aus auf dem Bildschirm ausgibt.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
14.07.2002, 17:24 Uhr
virtual
Sexiest Bit alive
(Operator)



Zitat:
Es soll nur noch eine Methode erstellt werden die mir diese Sortieren erledigt und die Zeilen dann aus auf dem Bildschirm ausgibt.

Aus dem was du bisher geschrieben hast, gibt es in der Klasse loc eine Variable, die etwa so aussieht:

C++:
class loc
{
    Element  v[MAX];
};


Element koennte etwa so aussehen:

C++:
struct Element
{
    std:string ip;
    ...
};


Ich nehme an, dass Du v sortieren willst. Zunaechst mal musst Du eine Fkt. schreiben, die dir erlaubt, zwei Element Instanzen miteinander zu vergleichen:

C++:
int ElementVergleich(const element& e1, const element& e2)
{
        return e1.ip.compare(e2.ip);
}


Hier nehme ich mal an, dass du nach der ip sortieren moechtest. Theoretisch wuerden dir jetzt zwei Wege offenstehen. Einmal der C Weg und damit die qsort Funktion. Von der ist aber abzusehen, wenn Element irgendwelche Klassen enthaelt. Die bessere Wahl scheint mir das sort Template aus dem algorithm Header zu sein (sollte sich genau wie qsort laufzeittehnisch verhalten, vielleicht sogar schneller), also:

C++:
::sort(v, v+count, ElementVergleich);


Sortiert dir den Vector (unter der annahme, dass count die Anzahl der verwendeten Vektoreintraege enthaelt).
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)

Dieser Post wurde am 14.07.2002 um 17:29 Uhr von virtual editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
14.07.2002, 17:48 Uhr
~uTaNG
Gast


jo,

C++:
class Easyloc
{
    private:
        Element v[MAX];        // Der Vektor und die
        int count;            // aktuelle Anzahl der Elemente


ich habe das mit dem Count eingefügt,weill ich nicht weiss genau weiss wie das unter der Konsole aussieht. Ob das der Konsole egal ist wielang eine Datei ist oder nicht. Deshalb habe ich n Counter "erstamel eingebaut der sagt der er bis MAX=200 Elemente auslesen und anzeigen soll.


C++:
void print()const;
        int  print( const string& ip)const;

inline void printline( const Element& el)    // Eine Zeile
{
cout << left << el.ip << endl;
}

void Log::print() const     // Alle Einträge ausgeben
{
if( count == 0)
     cout << "\nDie LoG ist leer!" << endl;
else
{
         for( int i = 0; i < count; ++i)
         printline( v);
}
}
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
14.07.2002, 18:06 Uhr
virtual
Sexiest Bit alive
(Operator)


Gehts denn jetzt so wie ich beschrieb?

Du hattest uebrigens auch einfach std::vector verwenden koennen, denn dann hast die keine Begrenzung, was die Vektor groesse angeht. Wenn du sie doch willst, kannst du sie ja immer noch einbauen...
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
22.07.2002, 08:43 Uhr
~uTaNG
Gast


Dank virtual funzt das Auslesen der IP super, nun möchte ich das der Pfad mit ausgelesen wird. Desweiteren möchte das ich vor der IP die Zeichen ">>" und nach dem Pfad "<<" gesetzt werden.

Immoment sieht es so aus:

IP

Ziel:

>>IP/PFAD/<<



C++:
// Typ eines Listen-Elements:
struct Element { string ip; };

/* VIRTUAL: DIESE Funktion braucht man als Callback fürs sortieren */

int ElementVergleich(const Element& e1, const Element& e2)
{
        return e1.ip.compare(e2.ip);
}

while ( i < MAX )
    {
        // VIRTUAL: getline ( infile, v.ip , '\0');
        // Was soll das mit dem NullByte???
        getline (infile, v[i].ip);
        if( !infile)
            break;

        std::string::size_type pos = v[i].ip.find_first_of("/");
        if (std::string::npos == pos) continue;
        v[i].ip = v[i].ip.substr(0, pos);
        int ip1, ip2, ip3, ip4;
        if (4!=sscanf(v[i].ip.c_str(), "%d.%d.%d.%d", &ip1, &ip2, &ip3, &ip4))
        continue;

        ++i;
    }


Hat da wer eine Idee?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
22.07.2002, 09:50 Uhr
virtual
Sexiest Bit alive
(Operator)


Hi,

zunächst mußt du die Struktur Element erweitern:

C++:
struct Element
{
   string ip;
   [b]string pfad:[/b]
};


Im folgenden Ersetze ich mal i durch j, weil der Index i nicht korrekt dargestellt wird. Also, folgende Zeile musst du ersetzen:

C++:
v[j].ip = v[j].ip.substr(0, pos);


durch

C++:
v[j].pfad = v[j].ip.substr(pos);
v[j].ip = v[j].ip.substr(0, pos);


Für die Ausgabe fehlt mir jetzt der Source, aber da sollte sinngemäß stehen:

C++:
stream << ">>" << v[j].ip << v[j].pfad << "<<" << endl;


--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)

Dieser Post wurde am 22.07.2002 um 09:50 Uhr von virtual editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
24.07.2002, 17:57 Uhr
~uTaNG
Gast


super DANKE,

Wie mache ich das er bei dem PFAD nur bis zu dem Zeichen ' \ ' ausliest?
 
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: