Abschlusszeichen erkennen
-
Wie wäre es, wenn Du zählst wieviele Zeichen Du schon geschrieben hast?
int i=0; while(/*noch nicht am ende*/) { cout<<_out; i++; if(i<4) cout<<","<< else { cout<<endl; i=0; } }
Hoffentlich habe ich jetzt das Richtige geschrieben.
-
daishi schrieb:
Wie wäre es, wenn Du zählst wieviele Zeichen Du schon geschrieben hast?
[...]Woher soll ich denn wissen, wann die Zeile zu ende ist?
-
Du mußt doch wissen, wieviele Elemente Du in eine Zeile einer Datei schreiben willst oder?
-
Nein, das weiß ich vorher leider nicht :(. Das kann sich auch in jeder Zeile ändern.
-
schern schrieb:
Das ist eine sehr gute Idee :). Wie kann ich den abfragen, ob ich am Anfang der Zeile bin oder nicht?
Du kannst in einem Flag speichern, ob beim letzten Aufruf ein \n dabei war. Dann bist du am Anfang der Zeile und lässt beim nächsten Aufruf das Komma weg. Dann setzt du das Flag wieder zurück.
-
Okay, das sollte so funktionieren, kann ich außerdem auch auf 'endl' prüfen?
Gibt es vielleicht auch eine Möglichkeit zu erfragen, ob man an Position 0 der aktuellen Ausgabezeile ist?
-
schern schrieb:
Okay, das sollte so funktionieren, kann ich außerdem auch auf 'endl' prüfen?
endl sollte zuerst ein '\n' an den Stream schicken und dann flush aufrufen, also sollte keine Sonderbehandlung notwendig sein.
Gibt es vielleicht auch eine Möglichkeit zu erfragen, ob man an Position 0 der aktuellen Ausgabezeile ist?
Wenn nach dem '\n' noch nichts ausgegeben wurde. Dafür sollst du ja das Flag benutzen.
-
Wie kann ich denn in meinem Konkreten Fall auf 'endl' oder '\n' prüfen?
template<typename T> inline TableWriter& TableWriter::operator<<( const T& out ) { line_ss << out; if( out == "\n" || out[0] == '\n' ) { size_t len = line_ss.str().length() - 3; fout << line_ss.str().substr( 0, len ) << endl; } return *this; } TableWriter& TableWriter::operator<<( ostream& out( ostream& ) ) { line_ss << out; if( out == endl ) { size_t len = line_ss.str().length() - 3; fout << line_ss.str().substr( 0, len ) << endl; } return *this; }
Ich weiß, dass der Code so nicht funktioniert aber leider habe ich gerade keine Ahnung wie ich das nun machen soll
-
Ich würde das in etwa so machen:
class TableWriter { public: TableWriter() : zeilenAnfang(true) {} template<typename T> TableWriter& operator<<(const T& t) { if(zeilenAnfang) { std::cout << t; zeilenAnfang = false; } else { std::cout << ", " << t; } return *this; } TableWriter& TableWriter::operator<<( std::ostream& (*out)( std::ostream& ) ) { if(out == endl) BeginneNeueZeile(); return *this; } TableWriter& operator<<(char c) { if(c == '\n') BeginneNeueZeile(); return *this; } private: void BeginneNeueZeile() { zeilenAnfang = true; std::cout << '\n'; } bool zeilenAnfang; };
-
syntaktisch richtig:
TableWriter& /* hier ohne TableWriter::*/operator<<( std::ostream& (*out)( std::ostream& ) ) { if(out == static_cast<std::ostream&(*)(std::ostream&)>(endl)) //endl ist ein template! BeginneNeueZeile(); return *this; }