Портативный конец линии
есть ли способ автоматического использования правильного символа 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.