[C++]Nach String suchen, teilen und speichern

Ja, mit "klappt nicht" meinte ich, dass er die Datei mit dem angegebenen Pfad nicht öffnen konnte.
Das Programm, sowie die Datei liegen im gleichen Ordner in den Eigenen Dateien. Kann es da irgendwelche "rechtlichen Probleme" ;) geben ? Schreibgeschützt ist jedenfalls nichts.

P.S.: Die Ausgabedatei wird aber erstellt, wenn das Programm abgelaufen ist. Steht halt nur nichts drin.
Und die Ausgabedatei ist dann auch im Ordner wo das Programm und die Eingabedatei sich befinden?

Schreibgeschützt darf die Eingabedatei ja sein - die wird ja sowieso im Nur-Lesen Modus geöffnet.

Evtl. hat die Datei eine zweite Endung? Sprich die Datei heißt in Wirklichkeit "Logfile.txt.txt"?

Gruß
 
Ihr habt's echt drauf :)
Tatsächlich hieß die Logfile.txt.txt.
Jetzt wird die Datei auch geöffnet, die richtigen Daten ausgelesen und in ergebnis.txt gespeichert.
Allerdings bricht er vorher irgendwo ab. Die letzten Datensätze fehlen. Außerdem schließt sich das Commad-Line Fenster von selbst, ohne auf Eingabe zu warten. Kann es sein, dass die Datenmenge zu groß ist ?
 
Also, er liest genau 3848 Zeilen, die mit [c1?s] anfangen ein, dann bricht er ab. Ich hab das Suchkriterium eingeschränkt, so dass er die Zahl nur einliest, wenn sie nicht mit "0" anfängt. Da bekomme ich nur die Datensätze zurück, die auch ohne die Enschränkung mit dabei waren, er scheint also etwa nach genau der Zeit abzubrechen.

Ideen ? Danke übrigens schonmal vielmals für die Hilfe soweit !
 
Das sieht nach Absturz aus. Möglicherweise sind Zeilen dabei, die nicht dem erwarteten Schema entsprechen. Du solltest daher erstmal die Länge der Zeile überprüfen, bevor auf nicht existente Spaltenpositionen zugegriffen wird:
C++:
if( strLine.size() > 24 )
{
    if( strLine.substr(0,3).compare("[c1") == 0 && strLine.at(4) == 's' )
    {
        outfile << strLine.substr(20,4) << std::endl;
    }
}
Gruß
MCoder
 
Das wars!
Tausend Dank an alle die geholfen haben!
Dann mach ich mich jetzt mal an die Feinheiten. Wird wahrscheinlich noch die eine oder andere Frage kommen.

Gruß
Seelenquell
 
Okay, wie versprochen, die nächste Frage ;)
Die Strings, die ich jetzt in der Ausgabedatei habe, sind Hex-Zahlen.
Ich nehme an den String kann man nicht direkt von Hex zu Dez umwandeln.
Wie bekomme ich jetzt also aus dem Hex-String eine Dezimal-Integer ?

Zweck: Die Ausgabedatei soll in Excel geöffnet werden und aus der Tabelle ein Diagramm gemacht werden. Excel kann ohne Add-Ins aber wohl nicht mit Hex umgehen und die sind hier nicht ohne weiteres vorhanden.

Ich habe mir einige Herangehensweisen hier im Forum angesehen, der Compiler meckert aber immer, dass er einen const char braucht und keinen string.

Danke schonmal !
 
Hi.

Umwandlungen von String in andere Typen kannst du in C++ sehr einfach mit einem Stringstream machen:
C++:
#include <sstream>

std::string hexstr("aeff"); // als Bsp. für die Eingabe
std::istringstream conv(hexstr);
int d;

if (conv >> std::hex >> d) {
  // d == 44799
}
Gruß
 
Hat auch wieder geklappt, danke!

Jetzt versuche ich gerade eine Pfadeingabe zu schreiben.

Code:
cout<<"Bitte geben Sie den Pfad zur auszulesenden Datei an:\n";
string dateiPfad;
cin>>dateiPfad;

Da std::ifstream infile () mit dem String nichts anfangen kann, wandle ich ihn in einen CString um.

Code:
const char* Pfad = dateiPfad.c_str();

Ist wahrscheinlich unglaublich umständlich, mit der Varibalen Pfad kann std:ifstream infile() aber was anfangen. Leider aber nur, wenn ich den Dateinamen eingebe (Datei liegt im selben Verzeichnis, wie das Programm). Wenn ich den kompletten Pfad zur Datei angebe, kann die Datei nicht geöffnet werden. Dabei habe ich die Backslashes durch \\ ersetzt.
Da hänge ich gerade.

Ziel ist es, in das geöffnete Command Line Fenster die Datei zu ziehen und Enter zu drücken, um den Pfad zu übergeben. Dazu müssten wohl die Backslashes ersetzt werden und die Gänsefüßchen in denen der Pfad der gedropten Datei steht entfernt werden.
Wenn aber der Pfad schon zu Fuß eingegeben nicht funktioniert...
 
Hallo,

die Methode "c_str()" liefert einfach nur einen Zeiger auf einen char-Buffer, macht aber kein Wandlung in einen "CString" (das ist eine MFC-Klasse). Überigens kannst du dir die Umwandlung in eine Variable sparen und den Ausdruck gleich in "ifstream" einsetzen; dann sieht's auch nicht mehr so umständlich aus :)
C++:
ifstream infile(dateiPfad.c_str());

Die Anwendung von "cin" ist eigentlich falsch. Beschwert sich denn nicht der Compiler?
Sollte so aussehen:
C++:
string dateiPfad;
getline(cin, dateiPfad);

Um die Backslashes braucht du dich nicht zu kümmern, die werden von "cin" schon korrekt abgelegt. Die Anführungszeichen müssen allerdings weg:
C++:
string::size_type nPos;

while( (nPos = dateiPfad.find("\"")) != string::npos )
{
    dateiPfad.replace(nPos, 1, "");
}
Gruß
MCoder
 
Jetzt versuche ich gerade eine Pfadeingabe zu schreiben.

Code:
cout<<"Bitte geben Sie den Pfad zur auszulesenden Datei an:\n";
string dateiPfad;
cin>>dateiPfad;
Du solltest lieber mit getline Einlesen, da der Eingabeoperator >> nur wortweise einliest und du so nur das erste Wort von der Zeile bis Leerraumzeichen (Leerzeichen, Tab, Newline) kommen erhälst.
Da std::ifstream infile () mit dem String nichts anfangen kann, wandle ich ihn in einen CString um.

Code:
const char* Pfad = dateiPfad.c_str();

Ist wahrscheinlich unglaublich umständlich, mit der Varibalen Pfad kann std:ifstream infile() aber was anfangen.
Das ist die übliche Vorgehensweise, da die iostream Klassen leider keine std::strings entgegennehmen.
Leider aber nur, wenn ich den Dateinamen eingebe (Datei liegt im selben Verzeichnis, wie das Programm). Wenn ich den kompletten Pfad zur Datei angebe, kann die Datei nicht geöffnet werden. Dabei habe ich die Backslashes durch \\ ersetzt.
Da hänge ich gerade.

Ziel ist es, in das geöffnete Command Line Fenster die Datei zu ziehen und Enter zu drücken, um den Pfad zu übergeben. Dazu müssten wohl die Backslashes ersetzt werden und die Gänsefüßchen in denen der Pfad der gedropten Datei steht entfernt werden.
Wenn aber der Pfad schon zu Fuß eingegeben nicht funktioniert...
Du mußt die umgekehrten Schrägstriche nur entwerten, wenn du den Pfad im Programm angibst, da die umgekehrten Schrägstriche eine besondere Bedeutung für den C++ Compiler haben.

Die Eingaben, die du auf der Kommandozeile machst, brauchst du nicht nochmal entwerten.

Allerdings müßtest du die Anführungszeichen entfernen, falls dort welche eingefügt wurden. Das kannst du aber relativ einfach machen, indem du schaust ob das erste und letzte Zeichen ein " ist und dann den entsprechenden Substring nimmst.

Gruß
 
Zurück