brauch hilfe zu einem program



  • Hallo Leute,
    ich muss für die schule ein C++ Programm schreiben und da ich noch nicht soviel mit c\c++ gemacht habe würde ich mich freuen wenn ihr mir ein paar Tipps geben könntet wie ich irgendwas besser machen kann.

    Nun zu meinem Programm:
    Das Programm soll die Tasteneingaben über eine (Hook).dll - Datei abfangen und die Anzahl der anschläge in eine Log-Testdatei erhöhen und abspeichern. Die dll Datei habe ich schon mit hilfe des Internets realisiert und es funktioniert mehr oder weniger schon. (Funkitioniert nicht wenn man das Fenster minimiert)

    Nun kommen wir zu dem Punkt wo ich auf eine Tasteneigabe reagieren will.
    Die Logfile habe ich so vorbereitet das ich jede Taste schon mal mit dem Wert definiert haben:

    "ECS/0"F1/0"F2/0"F3/0"...... (In dem Format als String abgespeichert)

    Nun bekomme ich z.B die Eingabe "F1". Jetzt will ich die Datei öffnen, im String nach dem Eintrag "F1" suchen, den Wert nach dem nächsten "/" erhöhen und wieder abspeichern. Vielleicht mach ich das ja alles viel zu umständlich, aber ne andere lösung ist mir nicht eingefallen und melde mich deswegen ja bei euch.

    Hier mein Code zum erhöhen der Taste

    void TKeyHookForm::addKey(char Key[40])
    {
     //Hier wird die logfile DAtei hochgeladen und der Wert für die
     //übergeben Taste wird um eins erhöht
    
       datei = fopen(logfile,"rt");
       char* str_line1,* str_line2;
       int ok = 0;
    
       char line[line_size];   //Line_size = 50000 
       fgets(line,line_size,datei);
       str_line1 = strtok(line, "\"" );  //str_line1 hat doch jetzt z.B: F3/12
       while (str_line1 != NULL){
         str_line2 = strtok(str_line1, "/"); //str_line2 hat dann jetzt F3
         if (str_line2 == Key){              
            Memo1->SetSelTextBuf(str_line2); //solange in der schleife bis die 
                                             //Taste passt und dann ausgabe
            ok = 1;
         }
         if(ok = 1)break;
         str_line1 = strtok(line, "\"" );
       }
       fclose(datei);
    }
    //---------------------------------------------------------------------------
    

    Ich habs jetzt erstmal mit nur "Ausgeben wenn die richtige Taste gefunden wurder" versucht. Weil ich noch folgende Probleme habe:
    - Wenn ich die Richtige Taste gefunden habe, wie komme ich dann zu dem Wert?
    - Wie kann ich am besten den veränderten String wieder zusammenfügen und
    abspeichern

    Ich hoffe ihr könnt mir einpaar Tipps geben wie ich das besser machen kann.

    Danke schön...
    semid



  • Das kann arg kompliziert werden, wenn du bei jedem Tastendruck durch die Datei ratterst (und spätestens beim 10. Druck auf ESC mußt du alle Daten nach hinten verschieben, um die "10" reinquetschen zu können). Lies dir deine Datei lieber einmal in den Speicher ein (z.B. in eine map<string,int>) und arbeite dann auf den eingelesenen Daten - bei Programmende kannst du alle Daten wieder auf Platte schreiben.



  • Hallo CStoll,

    ok einmal einlesen, verstanden.
    Kannst du mir vielleicht sagen was du mit map<string,int> meinst oder ein beispiel zeigen.

    Danke
    semid



  • ...oder du nimmst irgendeinen keylogger der alles in eine datei schreibt und wertest die am schluss aus.



  • Zum Thema map<> findest du im Magazin einen Artikel (STL Teil 1). Dort kannst du zu jeder interessanten Taste den Namen (string) und die Anzahl der Tastendrücke (int) eintragen. Beim Programmstart mußt du aus der seltsamen Dateistruktur dort oben die Taste/Wert-Paare auslesen und in deine Map einfügen, im laufenden Programm erhöhst du die Werte und am Ende schreibst du alles wieder zurück:

    map<string,int> tasten;
    
    //Start:
    ifstream file("tasten.txt");
    while(file)
    {
      string name;int wert;
      file.get();             // " auslesen
      getline(file,name,'/'); // Name lesen (überliest das Endezeichen /)
      file>>wert;
      if(file) tasten.insert(make_pair(name,wert));
    }
    file.close();
    
    //Tastendruck auswerten
    string name = hole_taste();//gibt den Namen der aktuellen Taste als String zurück
    tasten[name]++;//erhöhe Zähler
    
    //Programmende
    ofstream file("tasten.txt");
    for(map<string,int>::iterator p=tasten.begin();p!=tasten.end();++p)
      file<<'"'<<p->first<<'/'<<p->second;
    file<<'"';
    file.close();
    


  • hallo ich bin es wieder...

    - Ich hab auf meinem Form ein paar Buttons erstellt und will als Aktion nur eine Methode aufrufen. In der Methode will ich aber wissen von welchem Button die aufgerufen wurde.
    Kann mir jemand sagen ob das irgendwie möglich ist und wie?

    - Kann ich irgendwie zwei String Variablen (keine char) vergleichen.

    Also:

    string f1,f2;
    
    strcpy(f1, "das ist ein Test");
    strcpy(f2, "das ist ein Test");
    //=> gleich
    
    strcpy(f1, "das ist ein Test");
    strcpy(f2, "das ist kein Test");
    //=>ungleich
    

    Danke schön



  • semid schrieb:

    string f1,f2;
    
    strcpy(f1, "das ist ein Test");
    strcpy(f2, "das ist ein Test");
    //=> gleich
    
    strcpy(f1, "das ist ein Test");
    strcpy(f2, "das ist kein Test");
    //=>ungleich
    

    *lol*

    Ein Beispiel:

    #include <iostream>
    #include <string>
    
    using namespace std;
    
    int main( )
    {
        string one = "Hello!", two;
    
        cout << "My string is \"" << one << "\". Enter one: " << endl;
        cin >> two;
    
        cout << "\"" << one;
        if( one.compare( two ) == 0 ) {
    
            cout << "\" == \"";
    
        } else {
    
            cout << "\" != \"";
        }
        cout << two << "\"." << endl;
    }
    

    Greetz, Swordfish



  • Hi, eigentlich muss das gehen aber irgendwie läufs nicht.
    DAs Problem ist das er die Daten in der logfile nicht überschreibt sondern die einzelnen Tasten die != 0 sind hinzufügt. Und somit muss ich wenn ich die log-Datei hochlade die Summe der einzellnen Tasten haben:
    [code]
    // Die log-Datei wird hochgeladen und die Taste mit dem dazuhörigem Wert
    // wird in die map "Taste" geschrieben
    string name, old_name, new_name;
    int wert, old_wert, cmp;
    ifstream logfile("log.txt");
    while(logfile)
    {
    logfile.get(); // " auslesen
    getline(logfile,name,'/'); // Name lesen (überliest das Endezeichen /)
    logfile>>wert;
    new_name = name; //Welche Taste grade ausgelesen wird
    if(logfile)
    {
    //Wenn die Taste die grade ausgelesen wurde nicht die Taste ist die
    //letztes mal ausgelesen wurde. => Gleiche Tasten werden Summiert
    //und die Summe wird in die Map gespeichert

    if( new_name.compare( old_name ) != 0 )
    {
    tasten.insert(make_pair(old_name,old_wert));
    old_wert = 0;
    ListBox1->Items->Add(tasten[old_name]);
    }
    }
    old_name = name; //Welche Taste grade ausgelesen wurde
    old_wert+=wert;
    }
    logfile.close();
    [code]

    Bei dem Punkt "if( new_name.compare( old_name ) != 0 ) " geht er trotzdem in die if-Anweisung auch wenn new_name und old_name gleich sind.

    HAt jemand nen Tip...

    Danke schön



  • Hatte noch was vergessen...

    Hab jetzt 2 Forms erstellt, und muss im 2tem Form die 1te unit.h datei includieren um mit der Klasse zuarbeiten.
    Wenn ich das aber mache bekomme ich einen Fehler bei der deklaration von der
    map Variable:

    class TKeyHookForm : public TForm
    {
    __published:	// Von der IDE verwaltete Komponenten
            TButton *Button1;
            TListBox *ListBox1;
            TPerformanceGraph *PerformanceGraph1;
            void __fastcall FormCreate(TObject *Sender);
            void __fastcall FormDestroy(TObject *Sender);
            void __fastcall SaveData(TObject *Sender, TCloseAction &Action);
            void __fastcall Button1Click(TObject *Sender);
      private:	// Anwender-Deklarationen
        int Graph_var;
        MESSAGE void __fastcall KeyHook(TMessage &Message);
        BEGIN_MESSAGE_MAP
          MESSAGE_HANDLER(WM_KEYHOOK, TMessage, KeyHook);
        END_MESSAGE_MAP(TForm);
      public:      	// Anwender-Deklarationen
            __fastcall TKeyHookForm(TComponent* Owner);
             void addKey(char[]);
             map<string,int>tasten;      //Fehler
             int GetGraph_var(char[]);
    
    };
    

    [C++ Fehler] Unit1.h(35): E2303 Typname erwartet
    [C++ Fehler] Unit1.h(35): E2139 In Deklaration fehlt ;

    Hat jemand ne Idee woran das liegen könnte...

    Danke schön
    Semid



  • #include <map> vergessen?

    #include <stirng> vergessen?

    using namespace std vergessen?



  • #include <map> vergessen?
    #include <stirng> vergessen?

    ne hatte ich schon drin...
    was meinst du mit:
    using namespace std vergessen? 🙄

    Gruß
    semid



  • Hallo

    Es ist gemeint ob du die Anweisung

    using namespace std;
    

    nach den Includes der Headerdatei vergessen hast.

    Allerdings solltest du lieber immer std:: vor jedem Typ string, vector, map usw. schreiben.

    bis bald
    akari


Anmelden zum Antworten