Problem mit std::stringstream
-
Hallo Leute,
ich habe folgende Klasse geschrieben, welche zwei Methoden (StringBuildU & StringBuildF) beinhaltet, die mir pro Aufruf einen String zusammenstellen und den dann im stringstream speichern sollen.
Eine weitere Methode (GetString) sollte mir dann den Inhalt des stringstream in einen Strings schreiben und den dann zurückgeben.// XXX.hpp #pragma once #pragma warning(disable : 4996) #include <string> #include <sstream> class CStringBuild { private: int iCOM; int pos; std::string str; std::stringstream ss; int CheckS(std::string temp, int start) {/***/} public: explicit CStringBuild(int COM) : pos(0), iCOM(COM) {ss.str(str);} ~CStringBuild(void) {} void StringBuildU(double dU) { ss<<"#0"<<iCOM<<"0130"; if(dU < 10) ss<<'0'; dU *= 10; ss<<static_cast<int>(dU)<<CheckS(ss.str(), pos)<<"\r"; } void StringBuildF(double dF) { ss<<"#0"<<iCOM<<"0090"; if(dU < 100) ss<<'0'; ss<<dF; ss<<static_cast<int>(dF)<<CheckS(ss.str(), pos)<<"\r"; } /* * */ inline std::string GetString(void) {ss>>str; return str;} }; // main.cpp #include <iostream> #include "XXX.hpp" using namespace std; int main() { CStringBuild lab(2); lab.StringBuildU(20.5); lab.StringBuildF(200); cout<<lab.GetString()<<endl; system("pause"); return 0; }
Geplante Ausgabe:
#01013020542\r#01009020042\r ('\r' nur exemplarisch)
Das funktioniert aber irgendwie nicht. Es wird immer nur der erste Teil (#01013020542\r) ausgegeben.
Kann mir jemand helfen?
-
Wie immer trennt der formatierte Ausleseoperator für Strings nach Trennzeichen wie \r. Daher:
inline std::string GetString(void) {return ss.str();}
-
Const-Correctness beachten. Getter verändern das Objekt nicht.
Und das "C"-Präfix bei Klassen war eigentlich mal nur für die MFC gedacht. Für eigene Klassen würde ich es nicht verwenden, da es keine Vorteile hat.
-
Ok danke jetzt funktionierts
#pragma once #pragma warning(disable : 4996) #include <sstream> class CStringBuild { private: int iCOM; int pos; std::stringstream ss; int CheckS(const char* temp, int start) { char CS[128]; strcpy(CS, temp); int sum = 0; for(unsigned int i = start+1; i < strlen(CS); i++) sum += static_cast<int>(CS[i])+48; if(sum > 512) sum -= 512; if(sum > 256) sum -= 256; return sum; } public: CStringBuild(int COM) : pos(0), iCOM(COM) {} ~CStringBuild(void) {} inline std::string GetString(void) {return ss.str();} void StringBuildU(double dU) { ss<<"#0"<<iCOM<<"0130"; if(dU < 10) ss<<'0'; dU *= 10; ss<<static_cast<int>(dU)<<CheckS(ss.str().c_str(), pos)<<"CR"; // ("CR" == \r) pos = static_cast<int>(ss.str().size()); } void StringBuildF(double dF) { ss<<"#0"<<iCOM<<"0090"; if(dU < 100) ss<<'0'; ss<<static_cast<int>(dF)<<CheckS(ss.str().c_str(), pos)<<"CR"; // ("CR" == \r) pos = static_cast<size_t>(ss.str().size()); } /* * */ };
Habe jetzt zur Veranschaulichung '\r' durch 'CR' ersetzt.
Hab da aber noch eine Frage zu meiner Methode "CheckS".
Diese soll mir die Checksumme des Strings bilden, also die Summe der Zeichen (abgesehen von # und \r) in ASCII.
Gibt es da eine Möglichkeit diese direkt aus meinen Stringstream zu berechnen?
-
NEO.PIXEL schrieb:
Hab da aber noch eine Frage zu meiner Methode "CheckS".
Diese soll mir die Checksumme des Strings bilden, also die Summe der Zeichen (abgesehen von # und \r) in ASCII.
Gibt es da eine Möglichkeit diese direkt aus meinen Stringstream zu berechnen?Du gehst halt alle Zeichen durch (mit .str() bekommst du einen String) und summierst sie auf. Du kannst auch std::accumulate dafür benutzen. Dazu schreibst du dir als Additionsoperator einen kleinen Funktor, welcher zwei Werte addiert, dabei aber # und \r ignoriert.
-
Danke für die Hilfe soweit
Mit std::accumulate funktionierts auch ganz gut, find ich aber irgendwie umständlicher.
Aber ist ne gute Alternative