std::endl ist überflüssig.
-
query_boy schrieb:
Oder?
nein, nur meistens

-
printf ist ohnehin besser.
*SCNR*
-
audacia schrieb:
printf ist ohnehin besser.
sowieso, aber das geht am thema vorbei.
topic: 'endl' springt in die nächst zeile, ich glaub 'flush' nicht.

-
flushing-fan schrieb:
topic: 'endl' springt in die nächst zeile, ich glaub 'flush' nicht.

das stimmt zwar, aber man kann std::endl und std::flush nicht vergleichen, die haben zwei unterscheidliche funktionen.
endl ist eigentlich das gleiche wie "\n", aber auch noch ein std::flush (bei bedarf)
-
ich hatte mal mit so'nem doofen borland-tool (developer-blahblah, irgendwie mit einem fetten X drin) herumgefummelt. der hat bei 'cout's' manchmal nix ausgegeben, erst wenn man endl oder flush am ende hatte.

-
Das ist normal. Der Output-Stream kann seinen Puffer solange füllen bis flush aufgerufen wird. std::endl ist nur eine komfortable Schreibweise für:
'\n' << std::flush;Intern ist std::cout zB mit std::cin verknüpft, so dass der Puffer geflusht wird, wenn man auf eine Benutzereingabe wartet.
Gruß
Don06
-
hm?
Ich habe auch schon mal "\n" ohne std::flush benutzt.
Hab ich mir das eingebildet, oder sind bei dem Programm dann irgendwelche Nachteile zu erwarten?
-
nein, nicht im regelfall.
das schlimmste szenario besteht darin, wenn dir dein programm abstürzt, bevor geflusht wurde, dann sind die daten, die noch im puffer waren, weg.
-
Hallo,
std::endl kannst du meines Wissens komplett vergessen.
-
obbba schrieb:
hm?
Ich habe auch schon mal "\n" ohne std::flush benutzt.
Hab ich mir das eingebildet, oder sind bei dem Programm dann irgendwelche Nachteile zu erwarten?
Das ist implementierungsabhängig. In der Regel wirst Du die Zeilenschaltung auch in der Ausgabe finden. Daher wirst Du in der Regel auch keine Nachteile sehen.
Schreib doch mal ein Programm, welches im Sekundentakt Zeilenweise in eine Datei schreibt. Dann beobachtest Du beispielsweise mit "tail -f", wie sich der Dateiinhalt verändert. Das machst Du einmal mit "\n" und einmal mit std::endl. Möglicherweise wirst Du einen Unterschied sehen.
Es hängt halt von der Situation ab, ob das relevant ist oder nicht. "\n" ist schneller, da die Daten in größeren Blöcken auf das Zielgerät geschrieben werden. Allerdings ist es nicht vorhersehbar, wann das geschieht.
Wallli schrieb:
Hallo,
std::endl kannst du meines Wissens komplett vergessen.
Vergiss es mal ruhig. Oder Du weitest Dein Wissen aus
.
-
Bitte beachten: '\n' und "\n" sind zwei verschiedene Dinge.
http://userpage.fu-berlin.de/~ram/pub/pub_jf47ht40Ht/c++_zeilenformatierung_de
-
Erhard Henkes schrieb:
Bitte beachten: '\n' und "\n" sind zwei verschiedene Dinge.
http://userpage.fu-berlin.de/~ram/pub/pub_jf47ht40Ht/c++_zeilenformatierung_de
Das hatten wir doch schonmal im Forum.
Das hier:
Wenn von C++ in Textdateien geschrieben wird, wird eine mit dem Neuzeilenzeichen abgeschlossenen Zeile automatisch in die passende (binäre) Darstellung des Betriebssystems umgewandelt. Manche Betriebssysteme verwenden ein anderes Zeichen oder eine Folge aus mehreren Zeichen zum Abschluß einer Zeile. Es gibt Betriebssysteme, die Zeilen gar nicht mit einem Abschlußzeichen kennzeichnen, sondern jeder Zeile ihre Länge voranstellen.
Kann ich weder anhand des Standards noch experiemtell unter Windows/OS X nachvollziehen. Es stimmt zwar, dass 'std::endl' ein systemspezifisches Neue-Zeile-Zeichen ausgibt. Es stimmt m.E. aber nicht, dass '\n' beim Ausgeben entsprechend umgewandelt wird.
-
Spielt das bei den Standard-Betriebssystemen überhaupt eine Rolle? Ich konnte bisher noch keinen Unterschied feststellen, wenn ich unter Windows eine in Linux erstellte Textdatei öffne oder unter Linux eine unter Windows erstellte.
Ich glaube die erkennen die gängigen Zeilenenden automatisch und wandeln entsprechend um (Binärmodus natürlich ausgenommen).
-
Unsicherer Programmierer schrieb:
Ich glaube die erkennen die gängigen Zeilenenden automatisch und wandeln entsprechend um
„Die“ (Betriebssysteme) wandern gar nichts um. Einige kluge Texteditoren tun das, die meisten (zumindest unter Windows) sind zu dumm dazu.
-
Konrad Rudolph schrieb:
Kann ich weder anhand des Standards noch experiemtell unter Windows/OS X nachvollziehen.
Nicht? Ich schon (MSVC 8.0):
#include <algorithm> #include <fstream> #include <iomanip> #include <iostream> #include <iterator> using namespace std; void print_byte(char ch) { unsigned val = static_cast<unsigned char>(ch); cout << setw(2) << setfill('0') << hex << val << " "; } int main(int argc, char* argv[]) { { ofstream out("test.txt"); out << "\n" << '\n' << endl; } { ifstream in("test.txt", ios::in | ios::binary); for_each(istreambuf_iterator<char>(in), istreambuf_iterator<char>(), &::print_byte); cout << endl; } return 0; }0d 0a 0d 0a 0d 0a
-
Konrad Rudolph schrieb:
Einige kluge Texteditoren tun das, die meisten (zumindest unter Windows) sind zu dumm dazu.
auch unter Windows ist es lediglich Notepad, der damit Schwierigkeiten hat... bereits Wordpad erkennt auch Linux-Zeilenumbrüche richtig
zum Thema:
Some people also believe that sending
endldown an output stream only writes a newline. This is incorrect; after a newline is written, the buffer is also flushed. Perhaps this is the effect you want when writing to a screen -- get the text out as soon as possible, etc -- but the buffering is largely wasted when doing this to a file.kommt also drauf an, was man erreichen will... bei einem
coutistendlsicherlich sinnvoll, bei Dateioperationen sollte man dagegen \n verwenden, wenn man lediglich eine neue Zeile haben will
-
Die Frage ist da doch eher ob es die Aufgabe eines Texteditors (nicht "Schreibprogramm") die Zeilenenden als solche zu erkennen oder einfach nur das auszugeben, was in der Datei steht.
Selbst Emacs hat da manchmal Schwierigkeiten.