Process terminated with status -1073741819 (0 minutes, 6 seconds)
-
Austrian schrieb:
Der zusammenhang ergibt sich über die Zahl 32
Ich kann ASCII. Wenn dir jemand im Forum so etwas schreibt wie ich, dann steckt da meistens mehr dahinter und ist als Aufforderung gedacht, mehr darüber nachzudenken.
Außerdem: Warum 32 schreiben, wenn du auch ' ' schreiben könntest? Dann muss der Leser weder ASCII auswendig können, noch bist du überhaupt darauf angewiesen, dass die Zielplattform diese Codierung benutzt (könnte ja z.B. EBCDIC verwenden).
Aber gucken wir es uns genauer an:
sinn des Codes: Wenn ein leerzeichen(ASCII 32) gefunden wird, dann soll der Code schauen ob danach noch ein Leerzeichen kommt und gegebenenfalls eleminieren.
Und wenn 3 Leerzeichen nacheinander kommen? Was ist, wenn j+1 hinter dem Stringende ist?
Das ganze noch bis Stringende (wert in while schleife hab ich inzwischen auf 0 korrigiert damit er am stringende, als bei der escape-sequenz, aufhört)
Wie kommst du darauf, dass am Ende des Strings 0 oder 10 stünde?
durchführen und schon hat man theoretisch einen sauberen string mit nur jeweils einem Leerzeichen zwischen den Abschnitten.
Nein, siehe oben.
-
Hier der neue, verbesserte Code.
while(eingabe[j]!=0) { if(eingabe[j]==32) { do { if(eingabe[j+1]==32) { eingabe.erase(j,1); } } while(eingabe[j+1]==32) if(eingabe[j+1]==0) eingabe.erase(j-1,1); } j++; }Um eines gleich klarzustellen: Ja, ich denke oft einfach viel zu umständlich und Ja, ich mache sehr viele (Anfänger)fehler und Ja, ich lasse mich gern belehren, aber das ist noch lange kein grund gleich so bissig zu sein (siehe:
Ich kann ASCII. Wenn dir jemand im Forum so etwas schreibt wie ich, dann steckt da meistens mehr dahinter und ist als Aufforderung gedacht, mehr darüber nachzudenken.
Meine Erklärungen sind nicht geschrieben um dir ASCII zu erklären, sondern meine irrsinnigen und oft umständliche Denkweisen, und natürlich lasst sich das viel einfacher, schneller und schöner machen, aber das wusste ich doch vorher nicht

Abgesehen davon gehe ich nicht davon aus dass das programm auf einer ASCII verstehenden plattform laufen wird,sondern ich weiß es.Zu deinem Einwand bez. der 3 leerzeichen: Du hast recht, ich hab die innere Schleife vergessen; jetzt sollten alle leerzeichen bis auf eines verschwinden.
Zum eingabe[j+1] hinter stringende problem: Der string muss doch EIGENTLICH (und ich sag jetz eigentlich weil ich mir nicht sicher bin) mit einer NULL aufhören; sprich 0 oder "\0", oder? Das heißt: selbst wenn das letzte zeichen vor der null ein leerzeichen ist kann man mit j+1 nicht über den string hinausgreifen, sondern nur auf die Null. (Ausserdem habe ich jetzt noch eine If-anweisung eingefügt die so eine Null entfernen müsste).
Soweit so gut.
Trotz allem danke für das Feedback und in weiterer Hoffnung auf Hilfe mit meinem Speicherproblem.

-
Austrian schrieb:
Zum eingabe[j+1] hinter stringende problem: Der string muss doch EIGENTLICH (und ich sag jetz eigentlich weil ich mir nicht sicher bin) mit einer NULL aufhören; sprich 0 oder "\0", oder?
Eben nicht. std::string muss weder auf Null enden, noch ist verboten, dass er selber Nullzeichen enthält. Warum nutzt du für so etwas nicht die Memberfunktionen der Stringklasse? Da hast du doch alles da was du brauchst. Als Anfänger kannst du mit Integerwerten und size() eine Schleife basteln. Wenn du dir etwas mehr zutraust, nimmst du Iteratoren.
Oder du machst einen ganz anderen Ansatz: Suche (find) und entferne(erase) so lange doppelte Leerzeichen, bis keines mehr gefunden wird. Ist zwar nicht die geschickteste Methode, aber dafür ein sehr robuster Zweizeiler, bei dem nichts schiefgehen kann.
-
Erst mal danke für die ausführliche Erklärung!
Das hier hat wirklich weitergeholfen.
Ich habe mich für die robusteste Variante entschieden, da sie auch die simpelste ist. Wie du schon gesagt hast ist es wirklich ein simpler ein/dreiszeiler (mit oder ohne do-while-schleife). Die genauen funktionen habe ich hier gefunden: http://www.willemer.de/informatik/cpp/string.htm
Allerdings geht daraus nicht hervor was find zurückgibt wenn es nichts findet (wäre wichtig da es mein Ausstiegswert ist)Ich werde mich jetzt im i-net schlau machen und falls ich nichts finde komme ich ohnehin zurück.
Danke und bis bald!
-
Hier ist eine ziemlich gute, ziemlich komplette Referenz für alle C++ (und auch C) Bedürfnisse:
www.cplusplus.comDort finden wir auch den Rückgabewert von find:
Return Value
The position of the first occurrence in the string of the searched content.
If the content is not found, the member value npos is returned.Das Beispiel auf der Seite demonstriert, wie das funktioniert.
-
Erstmal wieder danke an SeppJ für die hilfe und die seitenverweise.
Hab heute wieder einiges dazugelernt.
Soweit funktioniert da programm jetzt mitdo { eingabe.erase((eingabe.find(" ")),1); } while((eingabe.find(" ")!=string::npos));als leerzeichen-filter.
Das Grundproblem bleibt allerdings weiterhin bestehen: die Ausgabedatei bleibt weiterhin leer (Bei auskommentieren des "Filters" funktioniert das Programm einwandfrei).Danke, und ich mach jetz erstmal pause.
LG Austrian
-
Könntest du mal den Sourcecode so posten, wie er jetzt ist?
-
#include<string> #include<fstream> using namespace std; int main() { ifstream lesen("eingabe.txt"); ofstream schreiben; string eingabe; string eingabeVect[9]; int temp1 = 0; int temp2 = 0; int j=0; schreiben.open("ausgabe.txt"); while(getline(lesen, eingabe)) { /* while(j<eingabe.size()) { if(eingabe[j]==32) { do { if(eingabe[j+1]==32) { eingabe.erase(j,1); } } while(eingabe[j+1]==32); if(eingabe[j+1]==0) eingabe.erase(j-1,1); } j++; } */ do { eingabe.erase((eingabe.find(" ")),1); } while((eingabe.find(" ")!=string::npos)); for (int i = 0; i < 9; i++) { temp1 = temp2+1; if (temp2 <= eingabe.length()) temp2 = eingabe.find(" ", temp1); if (temp2 > temp1) eingabeVect[i] = eingabe.substr(temp1, temp2-temp1); else eingabeVect[i] = " "; } temp1 = 0; temp2 = 0; schreiben << "Mass " << eingabeVect[1] << " Soll: " << eingabeVect[4] << " +"; schreiben << eingabeVect[5] << "/" << eingabeVect[6] << " Ist: " << eingabeVect[3] << "\n"; } schreiben.close(); lesen.close(); return 0; }Hier bitte

-
Hallo Austrian,
es wundert mich ein wenig, dass Dir noch keiner gesagt hat, dass man in C++ Streamingoperatoren für Klassen und Strukturen überladen kann. Das ist ganz praktisch, man liest eine Struktur ein und gibt sie wieder aus. Wobei das Einlese- und Ausgabe-Format nicht übereinstimmen muss - in Deinem Fall sähe das etwa so aus:
#include <fstream> #include <iostream> #include <iomanip> // setprecision #include <string> struct X { // -- Einlesen // ist soll tol1 tol2 // M Z4.3.1_Z Dist 69.53 70.00 0.10 -0.10 [-0.47 -0.37] friend std::istream& operator>>( std::istream& in, X& x ) { std::string m, dist; if( (in >> m >> x.m_txt >> dist >> x.m_ist >> x.m_soll >> x.m_tol1 >> x.m_tol2).ignore( 9999, '\n' ) ) { if( m != "M" || dist != "Dist" ) in.setstate( std::ios_base::failbit ); } return in; } // -- Schreiben // soll tol1 tol2 ist // Mass Z4.3.1_Z Soll: 70.00 +0.10/-0.10 Ist: 69.53 friend std::ostream& operator<<( std::ostream& out, const X& x ) { return out << "Mass " << x.m_txt << " Soll: " << x.m_soll << " " << std::showpos << x.m_tol1 << "/" << x.m_tol2 << std::noshowpos << " Ist: " << x.m_ist; } private: std::string m_txt; double m_soll, m_tol1, m_tol2, m_ist; }; int main() { using namespace std; ifstream lesen("eingabe.txt"); ofstream schreiben("ausgabe.txt"); schreiben << fixed << setprecision(2); // sorgt dafür, dass alle double mit 2 Nachkommastellen ausgegeben werden for( X x; lesen >> x; ) // Lese bis nichts mehr geht .. schreiben << x << endl; return 0; }so kommt auch das '+'-Zeichen vor den ersten Toleranz-Wert .. so wie Du es in Deinem ersten Beitrag beschrieben hast.
Ich finde das wesentlich übersichtlicher, als das Rumgefrimele mit den Strings.
Gruß
Werner
-
Ich danke dir wirklich von ganzem herzen!!
Nein, ich wusste nicht dass man Streamingoperationen überladen kann.
Um ehrlich zu sein wusste ich bis vor kurzen nicht einmal was streams sind
Ich werde in zukunft sicher öfter hier vorbeischauen, da ein nicht unwesentlicher Teil meiner Ausbildung das Programmieren mit C/C++/Java ist und ich es auch in weiterer Folge verwenden muss. Wie gesagt stehe ich erst am anfang zu cpp (von java erst gar nicht zu reden) und freue mich über jede hilfe und jeden Ratschlag den ich bekommen kann.
PS: Werner, du bist echt toll

Du hast mir und meinem Kollegen (Ferialpraktikum) das Leben echt sehr erleichtert