19

使用している OS に応じて正しい EOL 文字を自動的に使用する方法はありますか?

私は何かのようなことを考えていたstd::eol

プリプロセッサ ディレクティブを使用するのは非常に簡単であることは知っていますが、それが既に利用可能かどうか知りたいです。

私が興味を持っているのは、通常、アプリケーションにいくつかのメッセージがあり、後でそれらを単一の文字列に結合し、それらを EOL で分離したいということです。使用できることはわかっていますstd::stringstream << endlが、通常の追加ではなく、やり過ぎのようです。

4

5 に答える 5

17

std::endlストリームへの書き込みとフラッシュ以外は何もしないように定義されています'\n'(§27.6.2.7)。フラッシングは a に対して何もしないように定義されているstringstreamので、かなり言い方が残りますmystringstream << '\n'。OS の標準ライブラリの実装は適切に変換される\nため、心配する必要はありません。

したがってendl、すでにパフォーマンスと移植性において究極のものであり<< '\n'、ファイル (文字列ストリームではなく) に効率的に書き込もうとしている場合にのみ必要です。への無意味<< '\n'な仮想呼び出しも排除しstringbuf::flushます。プロファイリングで空の関数呼び出しに時間がかかっていることが示されない限り、それについて考えないでください。

于 2010-03-26T07:39:50.630 に答える
11

行セパレーターをストリームに書き込みたい場合:

std::cout << '\n';

また

std::cout << "\n";

また

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

ストリームがテキスト モードで、OS が区切り記号として LF 以外を使用している場合は、変換されます。

行区切りを書き、ストリームをフラッシュする場合:

std::cout << std::endl;

何らかの理由でバイナリ モードの出力があり、プラットフォーム固有の改行を書きたい場合は、間接的に行う必要があると思います ('\n'テキスト ストリームに書き込んでから、バイナリ モードで調べて内容を確認します)。得る)。おそらく、私が気付いていない実装から改行シーケンスを直接取得する方法がいくつかあります。とにかく、それは良い考えではありません: バイナリ モードでファイルを読み書きする場合は、OS とは無関係に改行を定義するか、行をまったく持たない形式にする必要があります。それがバイナリモードの目的です。

于 2010-03-26T02:58:59.607 に答える
2

ファイルをテキストモードで開くだけ

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

その後

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

OS は、その標準に従って EOL を処理します。

于 2010-03-26T02:55:02.130 に答える
1

STL には std::endl があり、これを次のように使用できます。

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

エンドラインを追加するだけでなく、std::endl はバッファーもフラッシュすることに注意してください。これにより、パフォーマンスに望ましくない結果が生じる可能性があります。

于 2010-03-26T02:59:50.197 に答える
1

ファイルは、テキスト ファイルであっても、マシン間で転送されることが多いため、「OS 固有の改行文字」は矛盾した表現です。

多くの Windows プログラムは \n 間隔のファイルを正しく読み取りますが、winapi の複数行編集コントロールは正しく読み取りません。何が自分にとって正しいかを 2 回検討することをお勧めします。それは必ずしも OS が推奨するものではありません。ファイルをリムーバブル メディアに保存する場合は、OS 標準を使用しないでください。グローバル標準の 0xA を使用します。

于 2010-03-26T03:06:20.417 に答える