システムの行末文字を格納するヘッダー ファイルはどこかにありますか (そのため、#ifdefすべてのプラットフォーム、MAC、Windows、Linux などで動作しません)。
4 に答える
ファイルは「テキスト モード」(つまり「バイナリを使用しない」) で開く必要があり'\n'、ネイティブ ファイルが何であれ、改行は常に です。'\n'C ライブラリは、必要に応じて [つまり、テキスト ファイルの読み取り/書き込み] に改行を示すネイティブ文字を変換します。これは、「読み取った文字数を数え、それを使用してこの場所に戻る」ことに頼ることができないことも意味することに注意してください。
ファイルがバイナリの場合、改行はとにかく改行ではありません。
そして、本当に古いシステムで実行する予定がなく、本当にこれを実行したい場合を除き、私は次のようにします。
#ifdef __WINDOWS__ // Or something like that
#define END_LINE "\r\n"
#else
#define END_LINE "\n"
#endif
これは MacOS X より前の MacOS では機能しませんが、MacOS X より前のハードウェアを使用している人はもういないのでしょうか?
いいえ、\nどこにでもあるからです。テキストファイルに書き込むと、正しい改行文字に展開されます。
Posix では、\n である必要があります。したがって、_POSIX_VERSION が定義されている場合は \n です。それ以外の場合は、POSIX 以外の OS である Windows のみを特別なケースにすれば完了です。
標準ライブラリには、現在のプラットフォームの行末記号を取得するものはないようです。
最も近い API は次のとおりです。
char_type std::basic_ios::widen(char c);
「文字 c を現在のロケールで同等の文字に変換します」( cppreference )。std::endl「最終行文字を出力シーケンス os に挿入し、呼び出しのos.put(os.widen('\n'))後にos.flush()" ( cppreference ) を実行したかのようにフラッシュする」というドキュメントで指摘されました。
Posixでは、
widen('\n')を返します'\n'( として、charにchar基づくストリームの場合);endla を挿入し'\n'、バッファをフラッシュします。
Windows では、まったく同じことを行います。実際には
#include <iostream>
#include <fstream>
using namespace std;
int main() {
ofstream f;
f.open("aaa.txt", ios_base::out | ios_base::binary);
f << "aaa" << endl << "bbb";
f.close();
return 0;
}
行末記号と同じファイルが生成さ'\n'れます。
他の人が示唆しているように、ファイルがテキスト モード(デフォルト)で開かれている場合、Windows では'\n'自動的に変換さ'\r' '\n'れます。
( Windowsにstd::endl変換されたと誤って想定していたため、この回答を書き直しました)"\r\n"