Портативный конец линии - PullRequest
17 голосов
/ 26 марта 2010

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

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

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

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

Ответы [ 5 ]

13 голосов
/ 26 марта 2010

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

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

11 голосов
/ 26 марта 2010

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

std::cout << '\n';

или

std::cout << "\n";

или

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

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

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

std::cout << std::endl;

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

2 голосов
/ 26 марта 2010

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

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

, а затем

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

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

1 голос
/ 26 марта 2010

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

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

1 голос
/ 26 марта 2010

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

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

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

...