Fast unbekannten Zahl aus Datei auslesen und ausgeben
-
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.)