Fast unbekannten Zahl aus Datei auslesen und ausgeben
-
Hallo liebe Community!
Ich hätte mal eine Frage.
Unzwar geht es um das auslesen einer SteamID.
Jeder kennt wahrscheinlich Counter-Strike & co.Es gibt im Steam Ordner eine Datei namens "Steam.txt".
Dort steht die SteamID des Accounts drinne, die ich nun gern auslesen würde.Nur da ich ja nicht weiß wie genau diese SteamID lautet, weiß ich jetzt auch nicht genau, wie ich sie aus der Datei auslesen und auf der Konsole ausgeben kann?
CsComm Session Nov-28-2008 12:47:13.439 [2608] ReconnectThread (2608) Starting CsComm Session Nov-28-2008 12:47:52.008 [1112] CreateSession(blablabla@steamaccount.de,7,261)=0 attempt 1 CsComm ConnectionPool Nov-28-2008 12:47:52.293 [1112] Attempting new connection 0,12.123.312:27130 for [b]0:0:3217213[/b] CsComm Connection Nov-28-2008 12:47:52.294 [1112] {Cnx=0,0,12.123.312:27130} : Attempting new connection CsComm Connection Nov-28-2008 12:47:52.402 [1112] {Cnx=0,0,12.123.312:27130} : connected CsComm Connection Nov-28-2008 12:47:52.402 [2876] Recv Worker (2876) StartingSo sieht der Inhalt aus.
Ich habe mir gedacht, man kann ja einfach in der Datei nach "0:0:" (oder bei manchen auch "0:1:") suchen und dann bis zur nächsten Leerzeile alles auslesen.
Somit hätte man die SteamID.Doch wie realisiere ich das jetzt? Hab schon tausende von Source's im Inet gefunden, allerdings lesen die meistens den ganzen Code aus.
Das möchte ich aber aus Sicherheitsgründen nicht, da -wie man oben sieht- dann auch der Accountname ausgelesen wird.Hoffe jemand kann helfen

Mit freundlichen Grüßen
zacharyy
-
zacharyy schrieb:
Nur da ich ja nicht weiß wie genau diese SteamID lautet, weiß ich jetzt auch nicht genau, wie ich sie aus der Datei auslesen und auf der Konsole ausgeben kann?
Was erwartest du denn? Dass C++ eine Magie-Funktion bereitstellt, die errät, welche ID du willst, ohne sie zu kennen?
Du kannst ja einfach die Information des Accountnamens verwerfen, wenn du diese nicht mehr brauchst. Also entweder gar nicht erst speichern oder nachträglich aus dem String löschen.
BTW: Ist das okay, was du da versuchst?
-
Hay, erstmal danke für deine Antwort.
Natürlich ist C++ nicht = Magie... x)
Aber dachte das man evtl. die nächsten Zeichen bei "0:0:" auslesen kann.
Maximal 8Zeichen, da mehr eine SteamID eh nicht hat.
Ich denke es wäre umständlicher alle Information bis auf die ID zu verwerfen, oder?Warum sollte das nicht okay sein? Man kann nicht viel mit einer SteamID anfangen, ausser jemanden zu identifieren. Und genau das ist der Sinn.
Würde ich wirklich irgendwas bösartig vorhaben, könnte ich mir auch einfach die ganze Steam.txt Datei kopieren
-
Du suchst einfach nach dem string "0:0:" und wenn du ihn gefunden hast, dann speichere die nächste Zahl, die kommt.
std::ifstream, std::string und std::find sind da die Stichworte.
-
Hier ein wohlbemerkt vollständiger Code. Hatte gerade nichts zu tun und es ist ja keine große Sache...

#include <iostream> #include <fstream> #include <string> int main() { std::ifstream inFile("Test.txt"); if (!inFile.good()) { std::cerr << "Die Datei \"Test.txt\" konnte nicht geoeffnet werden." << std::endl; return 1; } std::string id; while (!inFile.eof()) { std::string buf; std::getline(inFile, buf); if (buf.find("0:0") != std::string::npos) { id = buf.substr(buf.find("0:0")); } } inFile.close(); std::cout << "ID: '" << id << "'" << std::endl; return 0; }
-
Und wie genau speichere ich die nächste Zahl/en die kommt/kommen?
Ich weiß zwar wie ich nach einem bestimmten String suche, aber nicht wie ich dann auch noch die nächsten Zeichen nach dem String und den String selbst ausgebe.
(In der Konsole oder Ausgabedatei soll also dann stehen: "Deine SteamID lautet: 0:0:12345")Habe es zurzeit so:
#include <windows.h> #include <fstream.h> using namespace std; int main() { const char *inputFilePath = "Steam.log"; const char *outputFilePath = "ID.txt"; ifstream inputFileStream(inputFilePath); ofstream outputFileStream(outputFilePath); string line; while (getline(inputFileStream, line)) { if (line.find("0:0:") != string::npos|| line.find("0:1:") != string::npos) { outputFileStream << line << endl; } } inputFileStream.close(); outputFileStream.close(); return 0; }Und jetzt zeigt er mir natürlich jede Zeile wo 0:0: oder 0:1: vorkommt. Wie krieg ich jetzt nur die einzelnen Zeichen hin?

-
Habe nicht beachtet, dass es auch Nummern mit 0:1: geben kann. Damit sowohl nach 0:0: als auch nach 0:1: gesucht wird, muss der Code so aussehen:
#include <iostream> #include <fstream> #include <string> int main() { std::ifstream inFile("Test.txt"); if (!inFile.good()) { std::cerr << "Die Datei \"Test.txt\" konnte nicht geoeffnet werden." << std::endl; return 1; } std::string id; while (!inFile.eof()) { std::string buf; std::getline(inFile, buf); size_t pos; if ((pos = buf.find("0:0:")) != std::string::npos || (pos = buf.find("0:1:")) != std::string::npos) { id = buf.substr(pos); } } inFile.close(); std::cout << "ID: '" << id << "'" << std::endl; return 0; }
-
Erstmal allerbesten dank an dich "blablubbla" !
Doch wenn ich deinen Code kompiliere und dann die .exe ausführe, zeigt er mir leider nur das an:20:00:05.945 [3792] ReconnectThread (3792) Told to exit
Da ab da ja das "0:0" anfängt.
Nun habe ich einfach ein : bei beiden "0:0" rangehängt, aber nun findet er garnichts mehr Oo
Weißt du da zufällig rat? Und evtl. das er nur maximal 8zeichen + die 0:0: ausliest.
Wäre übelst nett
-
blablubbla schrieb:
Habe nicht beachtet, dass es auch Nummern mit 0:1: geben kann. Damit sowohl nach 0:0: als auch nach 0:1: gesucht wird, muss der Code so aussehen:
#include <iostream> #include <fstream> #include <string> int main() { std::ifstream inFile("Test.txt"); if (!inFile.good()) { std::cerr << "Die Datei \"Test.txt\" konnte nicht geoeffnet werden." << std::endl; return 1; } std::string id; while (!inFile.eof()) { std::string buf; std::getline(inFile, buf); size_t pos; if ((pos = buf.find("0:0:")) != std::string::npos || (pos = buf.find("0:1:")) != std::string::npos) { id = buf.substr(pos); } } inFile.close(); std::cout << "ID: '" << id << "'" << std::endl; return 0; }Ja super wunderbar! ALLER besten dank. Funktioniert blenden. Tausend mal danke

-
Jetzt habe ich nurnoch eine Frage.
Die Steam.txt liegt im Steam Ordner.
Den ermittel ich perint steampfad() { unsigned char temp[99] = {""}; unsigned long size = sizeof(temp); HKEY hKey; RegOpenKey(HKEY_LOCAL_MACHINE, "Software\\Valve\\Steam", &hKey); RegQueryValueEx(hKey, "InstallPath", NULL, NULL, temp, &size); RegCloseKey(hKey); printf("Path: %s (Size: %lu)\n", temp, size); system("PAUSE"); return 0; }Wie kann ich das jetzt mit deinem Code verbinden?
So das er den Pfad sucht, dann die Datei und dann die ID in der Datei ausgibt?
-
Also wenn die Zahl doch ein wenig dynamischer sein kann, würde ich hier boost::regex empfehlen:
http://www.boost.org/doc/libs/1_37_0/libs/regex/doc/html/index.html
Damit kannst du da ganz elegant und flexibel suchen..
-
Du meinst Steam.log und nicht Steam.txt, oder?
Na ja, versuch es mal so:
#include <iostream> #include <fstream> #include <string> #include <sstream> #include <windows.h> std::string getSteamPath() { unsigned char temp[99] = {""}; unsigned long size = sizeof(temp); HKEY hKey; RegOpenKey(HKEY_LOCAL_MACHINE, "Software\\Valve\\Steam", &hKey); RegQueryValueEx(hKey, "InstallPath", NULL, NULL, temp, &size); RegCloseKey(hKey); std::stringstream tmpStrm; tmpStrm << temp; return tmpStrm.str(); } int main() { std::string path = getSteamPath() + "\\Steam.log"; std::ifstream inFile(path.c_str()); if (!inFile.good()) { std::cerr << "Die Datei \"" << path << "\" konnte nicht geoeffnet werden." << std::endl; return 1; } std::string id; while (!inFile.eof()) { std::string buf; std::getline(inFile, buf); size_t pos; if ((pos = buf.find("0:0:")) != std::string::npos || (pos = buf.find("0:1:")) != std::string::npos) { id = buf.substr(pos); break; } } inFile.close(); std::cout << "ID: '" << id << "'" << std::endl; return 0; }
-
Und nochmal ein mega danke von mir an dich!
Läuft wonderbest.
-
Ich habe noch eine Frage, möchte dafür aber nicht unbedingt einen neuen Thread öffnen.
Ich würde mir gern noch die Config auf den Desktop kopieren.
Also:
Steampfad lesen, Steam.log lesen und den Accountnamen in String speichern.
Mithilfe des Strings die Configdatei finden.
Die dann kopieren und direkte Kopie davon in den Ordner wo auch das Programm ist, erstellen.-> Steampfad über Regedit (z.B. C:\\Spiele\\Steam\)
-> Dann Steam.log auslesen wegen dem Accountnamen (ist ja bei jedem anders)
-> Das sieht dann so z.B. aus: C:\\Spiele\\Steam\\ACCOUNTNAME\\
-> Hinter dem Accountnamen noch den String "cstrike" setzten
-> Sieht dann so aus: C:\\Spiele\\Steam\\ACCOUNTNAME\\cstrike\\
-> Und genau in dem Ordner gibt es eine Datei die "config.cfg" heisst
-> Er liest alle Daten aus der "config.cfg" und erstellt dann eine "config.txt" im Ordner des Tools mit dem eingelesenen Inhalt.Kann mir jemand erklären wie ich das hinkriege?
Habe den Code zurzeit so:
string getSteamPath() { unsigned char temp[99] = {""}; unsigned long size = sizeof(temp); HKEY hKey; RegOpenKey(HKEY_CURRENT_USER, "Software\\Valve\\Steam", &hKey); RegQueryValueEx(hKey, "ModInstallPath", NULL, NULL, temp, &size); RegCloseKey(hKey); stringstream tmpStrm; tmpStrm << temp; return tmpStrm.str(); } int main() { string path = getSteamPath() + "\\config.txt"; const char *outFilePath = "config.txt"; ifstream inFile(path.c_str()); ofstream outFile(outFilePath); string line; while (getline(inFile, line)) { if (line.find("//") != string::npos|| line.find("bind") != string::npos) { outFile<<line<<endl; } } inFile.close(); outFile.close(); return 0; }Allerdings steht der Pfad nicht bei jedem in der Regedit.
Der "HKEY_LOCAL_MACHINE\\Software\\Valve\\Steam\\InstallPath" dafür schon!
(natürlich vorrausgesetzt Steam ist auch installiert.)