Портативный конец строки

там какой-либо путь состоит в том, чтобы автоматически использовать корректный символ EOL в зависимости от используемой ОС?

Я думал о чем-то как std::eol?

Я знаю, что это - очень простые в использовании директивы препроцессору, но любопытный, если это уже доступно.

То, чем я интересуюсь, - то, что у меня обычно есть некоторые сообщения в моих приложениях, что я объединяюсь позже в единственную строку, и я хочу разделить их с EOL. Я знаю, что мог использовать std::stringstream << endl но это, кажется, иногда излишество вместо постоянного клиента, добавляют.

18
задан BartoszKP 3 September 2015 в 21:27
поделиться

5 ответов

std::endl предназначен для того, чтобы ничего не делать, кроме как записывать 'n' в поток и промывать его (§27.6.2.7). Flushing определен так, чтобы ничего не делать для stringstream, поэтому у вас остается красивый способ сказать mystringstream << 'n'. Реализация стандартной библиотеки в вашей ОС преобразует n соответствующим образом, так что это не ваша задача.

Таким образом, endl уже является максимальной производительностью и переносимостью, и единственное, что вам может потребоваться, это << 'n', если вы пытаетесь эффективно записывать в файл (не строковый поток). Ну, << 'n' также устраняет бессмысленный виртуальный вызов stringbuf::flush. Если профилирование не показывает, что вызов пустой функции занимает время, не думайте об этом.

15
ответ дан 30 November 2019 в 08:03
поделиться

Просто откройте файл в текстовом режиме

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

, а затем

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

, и ОС позаботится об EOL в соответствии со своими стандартами.

2
ответ дан 30 November 2019 в 08:03
поделиться

Если вы хотите записать разделитель строк в поток:

std::cout << '\n';

или

std::cout << "\n";

или

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

Если поток текстовый и ОС использует в качестве разделителя что-либо кроме LF, он будет преобразован.

Если вы хотите записать разделитель строк и промыть поток:

std::cout << std::endl;

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

11
ответ дан 30 November 2019 в 08:03
поделиться

Ну, в STL есть std :: endl , который можно использовать как

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

. Обратите внимание, что помимо добавления конечной строки, std :: endl также очищает буфер, что может иметь нежелательные последствия для производительности.

1
ответ дан 30 November 2019 в 08:03
поделиться

Файлы, даже текстовые, часто передаются между машинами, поэтому «специфичный для ОС символ новой строки» - это оксюморон.

Это правда, что операционные системы имеют право голоса в этом вопросе, особенно одна операционная система, известная как Windows, хотя многие программы Windows будут правильно читать файлы, расположенные с интервалом \ n, даже если элемент управления многострочным редактированием winapi этого не сделает. Я предлагаю вам дважды подумать о том, что подходит вам: это не обязательно то, что рекомендует ваша ОС. Если ваши файлы когда-либо будут храниться на съемном носителе, не используйте стандарт ОС. Используйте глобальный стандарт 0xA.

1
ответ дан 30 November 2019 в 08:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: