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
abspeichernIch 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"); //=>ungleichDanke 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 gespeichertif( 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