2010-03-26 14 views
15

Gibt es eine Möglichkeit, das richtige EOL-Zeichen je nach verwendetem Betriebssystem automatisch zu verwenden?Portable Ende der Zeile

Ich dachte an etwas wie std::eol?

Ich weiß, dass es sehr einfach ist, Präprozessordirektiven zu verwenden, aber neugierig, wenn das bereits verfügbar ist.

Was mich interessiert ist, dass ich in der Regel einige Nachrichten in meinen Anwendungen habe, die ich später zu einer einzigen Zeichenfolge kombiniere, und ich möchte sie mit einem EOL getrennt haben. Ich weiß, dass ich std::stringstream << endl verwenden könnte, aber es scheint manchmal ein Overkill anstelle eines regulären Anhangs zu sein.

Antwort

11

std::endl ist definiert, nichts außer Schreiben '\n' in den Strom zu tun und es zu spülen (§27.6.2.7). Flushing ist definiert, um nichts für eine stringstream zu tun, so dass Sie mit einer schönen Art zu sagen mystringstream << '\n' verlassen werden. Die Standardbibliotheksimplementierung auf Ihrem Betriebssystem konvertiert \n entsprechend, also ist das nicht Ihr Anliegen.

So ist endl bereits die ultimative Leistung und Portabilität, und die einzige andere Sache, die Sie wollen, ist << '\n', wenn Sie versuchen, effizient in eine Datei (kein Stringstream) zu schreiben. Nun, << '\n' beseitigt auch den sinnlosen virtuellen Anruf zu stringbuf::flush. Wenn das Profiling nicht zeigt, dass der leere Funktionsaufruf Zeit braucht, denken Sie nicht darüber nach.

+0

Ich dachte, dass die Verwendung von '\ n's überall ist völlig in Ordnung und OS (Windows lesen) automatisch behandelt es zu \ r \ n, wenn ich in die Konsole und Dateien schreiben. Das ist mehr als genug für mich an dieser Stelle. – Andrew

+0

@Potatoswatter: Vielleicht, worauf Sie hinwiesen (angenommen, es ist der C++ - Standard), ist jetzt Abschnitt §27.7.3.8? – sturmer

+0

@sturmer Ja, das ist eine Referenz zu C++ 03, die zu der Zeit aktuell war. Die Zahlen ändern sich, aber der Abschnitt heißt [lib.ostream.manip]. Wie auch immer, dort gibt es nichts wirklich zu sehen. Es sagt nur "Effekte: Aufrufe' os.put (os.widen ('\ n')) ', dann' os.flush() '." – Potatoswatter

2

Öffnen Sie einfach eine Datei im Textmodus

FILE *fp = fopen("your_file.txt", "w+t"); 

und dann

fprintf(fp, "some string and integer %d\n", i); 
fclose(fp); 

und das Betriebssystem wird der EOL entsprechend ihrer Standards kümmern.

+7

Wie sehr ... C von dir :-) – paxdiablo

+1

Eheh ich bin eine alte Schule XD –

+2

Jetzt haben Sie vergessen, die Datei zu schließen. : P – GManNickG

10

Wenn Sie eine Linie Separator in einen Stream schreiben:

std::cout << '\n'; 

oder

std::cout << "\n"; 

oder

std::cout << "whatever you were going to say anyway\n"; 

Wenn der Stream im Textmodus ist und das Betriebssystem nutzt nichts anders als LF als Trennzeichen, wird es konvertiert.

Wenn Sie einen Zeilentrenner schreiben und den Strom bündig:

std::cout << std::endl; 

Wenn Sie aus irgendeinem Grunde binary-Modus ausgegeben haben, und Sie wollen einen plattformspezifischen Zeilenumbruch schreiben, dann denke ich, Sie müssen es möglicherweise indirekt tun (schreiben Sie '\n' zu einem Textstrom und untersuchen Sie es dann im binären Modus, um zu sehen, was Sie erhalten). Möglicherweise gibt es einen Weg, die Zeilenumbruchsequenz direkt von der Implementierung zu bekommen, die mir nicht bekannt ist. Es ist sowieso keine gute Idee: Wenn Sie eine Datei im Binärmodus schreiben oder lesen, sollte sie in einem Format sein, das unabhängig vom Betriebssystem Zeilenumbrüche definiert oder überhaupt keine Zeilen enthält. Das ist der Binärmodus für.

1

Nun hat die STL std :: endl, die Sie als

std::cout << "Hi five!" << std::endl; 

verwenden können Hinweis, dass eine endline neben Hinzufügen std :: endl auch den Puffer leert, was unerwünscht Leistung Folgen hat.

+1

Err ... das ist nicht STL, das sind Iostreams. –

+0

Ich stimme BillyONEal zu. Wenn Sie nur ein "\ n" wollen, schreiben Sie einfach "\ n", nicht "std :: endl". Ich habe einmal eine Beschleunigung um den Faktor 8 gesehen, nachdem ich "std :: endl" durch "\ n" ersetzt habe. – sbi

+0

Oh, ich wusste nicht, dass das getrennte Einheiten sind. Ich hatte das nur angenommen, weil sie den Namensraum teilen. Danke für die Korrektur. – dimatura

1

Dateien, auch Textdateien, werden oft zwischen Maschinen übertragen, so dass "os-spezifisches neues Zeilenzeichen" ein Oxymoron ist.

Es ist zwar wahr, dass Betriebssysteme ein Mitspracherecht haben, insbesondere ein Betriebssystem alias Windows, obwohl viele Windows-Programme \ n-spaced-Dateien korrekt lesen, obwohl das WinPi Multiline-Bearbeitungssteuerelement nicht. Ich schlage vor, dass Sie zweimal überlegen, was das Richtige für Sie ist: Es ist nicht unbedingt das, was Ihr Betriebssystem empfiehlt. Wenn Ihre Dateien jemals auf Wechselmedien gespeichert werden sollen, verwenden Sie nicht den Betriebssystemstandard. Verwenden Sie den globalen Standard 0xA.