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

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

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

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

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

Ответы

Ответ 1

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

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

Ответ 2

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

std::cout << '\n';

или

std::cout << "\n";

или

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

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

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

std::cout << std::endl;

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

Ответ 3

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

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

а затем

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

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

Ответ 4

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

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

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

Ответ 5

Файлы, даже текстовые файлы, часто передаются между машинами, поэтому "os-specific new line character" является оксюмороном.

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