Что 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" в зависимости от платформы.