Что std:: endl точно соответствует каждой платформе?

Размышление о UNIX, Windows и Mac и выходном потоке (как двоичном, так и текстовом),

Что означает std::endl, т.е. <CR><LF>, <LF> или <CR>? Или это всегда одно и то же независимо от платформы/компилятора?

Причина, по которой я спрашиваю, заключается в том, что я пишу TCP-клиент, который говорит о протоколе, который ожидает, что каждая команда закончится в <CR><LF>. Поэтому мне интересно, использовать ли в моих потоках std::endl или "\r\n".

EDIT: Хорошо, поэтому один сброс буфера, а другой нет. Я понимаю. Но если я выводя текст в файл, '\n' равно <LF> или он преобразуется в <CR><LF> в Windows и <LF> в Unix или нет? Я пока не вижу ясного ответа.

Ответ 1

Код:

stream << std::endl;

// Is equivalent to:

stream << "\n" << std::flush;

Таким образом, вопрос заключается в том, что отображает "\n" .
В обычных потоках ничего не происходит. Но для файловых потоков (в текстовом режиме) "\n" отображается в конце строки строки platfrom. Примечание. Чтение преобразует конец строки строки в конец строки в "\n" , когда оно читается из файла в текстовом режиме.

Итак, если вы используете обычный поток, ничего не происходит. Если вы используете поток файлов, просто убедитесь, что он открыт в двоичном режиме, чтобы преобразование не применялось:

stream << "\r\n"; // <CR><LF>

Ответ 2

Стандарт С++ говорит, что он:

Вызывает os.put(os.widen(\n)), затем os.flush()

То, что преобразует '\n' в, если оно вообще конвертируется, относится к типу потока, в котором он используется, плюс любой возможный режим, в котором может быть открыт поток.

Ответ 3

Используйте stream << "\r\n" (и откройте поток в двоичном режиме). stream << std::endl; эквивалентно stream << "\n" << flush;. "\n" может быть преобразован в "\ r\n", если код работает в Windows, но вы не можете рассчитывать на него - по крайней мере один компилятор Windows преобразует его в "\n\r". На Mac он, вероятно, будет преобразован в "\ r", а в Unix/Linux и большинстве подобных систем он останется как "\n".

Ответ 4

Цитата из принятого ответа на вопрос :

Различные символы окончания строки не имеют значения, предполагая, что файл открыт в текстовом режиме, и это то, что вы получаете, если не запрашиваете двоичный файл. Скомпилированная программа выведет правильную вещь для скомпилированной системы.

Единственное различие заключается в том, что std:: endl очищает выходной буфер, а '\n' - нет. Если вы не хотите, чтобы буфер часто промывался, используйте '\n'. Если вы это сделаете (например, если вы хотите получить весь вывод, а программа нестабильна), используйте std:: endl

В вашем случае, поскольку вы специально хотите <CR><LF>, вы должны явно использовать \r\n, а затем вызвать std::flush(), если вы все еще хотите очистить выходной буфер.

Ответ 5

Похоже, ваш вопрос запутался. Каждая команда заканчивается на []? Для сквозного протокола я бы предложил использовать разделитель, который не зависит от платформы. std:: endl может разрешить "\ r\n" или "\n\r" в зависимости от платформы.