там какой-либо путь состоит в том, чтобы автоматически использовать корректный символ EOL в зависимости от используемой ОС?
Я думал о чем-то как std::eol
?
Я знаю, что это - очень простые в использовании директивы препроцессору, но любопытный, если это уже доступно.
То, чем я интересуюсь, - то, что у меня обычно есть некоторые сообщения в моих приложениях, что я объединяюсь позже в единственную строку, и я хочу разделить их с EOL. Я знаю, что мог использовать std::stringstream << endl
но это, кажется, иногда излишество вместо постоянного клиента, добавляют.
std::endl
предназначен для того, чтобы ничего не делать, кроме как записывать 'n'
в поток и промывать его (§27.6.2.7). Flushing определен так, чтобы ничего не делать для stringstream
, поэтому у вас остается красивый способ сказать mystringstream << 'n'
. Реализация стандартной библиотеки в вашей ОС преобразует n
соответствующим образом, так что это не ваша задача.
Таким образом, endl
уже является максимальной производительностью и переносимостью, и единственное, что вам может потребоваться, это << 'n'
, если вы пытаетесь эффективно записывать в файл (не строковый поток). Ну, << 'n'
также устраняет бессмысленный виртуальный вызов stringbuf::flush
. Если профилирование не показывает, что вызов пустой функции занимает время, не думайте об этом.
Просто откройте файл в текстовом режиме
FILE *fp = fopen( "your_file.txt", "w+t" );
, а затем
fprintf( fp, "some string and integer %d\n", i );
fclose(fp);
, и ОС позаботится об EOL в соответствии со своими стандартами.
Если вы хотите записать разделитель строк в поток:
std::cout << '\n';
или
std::cout << "\n";
или
std::cout << "whatever you were going to say anyway\n";
Если поток текстовый и ОС использует в качестве разделителя что-либо кроме LF, он будет преобразован.
Если вы хотите записать разделитель строк и промыть поток:
std::cout << std::endl;
Если у вас по какой-то причине есть вывод в двоичном режиме, и вы хотите записать специфический для платформы перевод строки, то, я думаю, вам придется сделать это косвенно (записать '\n'
в текстовый поток, а затем просмотреть его в двоичном режиме и посмотреть, что получится). Возможно, есть какой-то способ напрямую получить последовательность перевода строки из реализации, о котором я не знаю. В любом случае, это не очень хорошая идея: если вы пишете или читаете файл в двоичном режиме, то он должен быть в формате, который определяет перенос строк независимо от ОС, или вообще не иметь строк. Вот для чего нужен двоичный режим для .
Ну, в STL есть std :: endl , который можно использовать как
std::cout << "Hi five!" << std::endl;
. Обратите внимание, что помимо добавления конечной строки, std :: endl также очищает буфер, что может иметь нежелательные последствия для производительности.
Файлы, даже текстовые, часто передаются между машинами, поэтому «специфичный для ОС символ новой строки» - это оксюморон.
Это правда, что операционные системы имеют право голоса в этом вопросе, особенно одна операционная система, известная как Windows, хотя многие программы Windows будут правильно читать файлы, расположенные с интервалом \ n, даже если элемент управления многострочным редактированием winapi этого не сделает. Я предлагаю вам дважды подумать о том, что подходит вам: это не обязательно то, что рекомендует ваша ОС. Если ваши файлы когда-либо будут храниться на съемном носителе, не используйте стандарт ОС. Используйте глобальный стандарт 0xA.