2010-03-26 2 views
15

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

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

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

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

ответ

11

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

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

+0

Я понял, что использование '\ n's везде отлично, и ОС (чтение Windows) автоматически обрабатывает его, чтобы стать \ r \ n, когда я пишу на консоль и в файлы. Этого более чем достаточно для меня в этот момент. – Andrew

+0

@Potatoswatter: возможно, то, на что вы указывали (при условии, что это стандарт C++), теперь находится в разделе §27.7.3.8? – sturmer

+0

@sturmer Да, это ссылка на C++ 03, которая была текущей в то время. Числа изменяются, но раздел называется [lib.ostream.manip]. Во всяком случае, там действительно ничего не видно. Он просто говорит «Эффекты: вызовы» os.put (os.widen ('\ n')) ', затем' os.flush() '." – Potatoswatter

2

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

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

, а затем

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

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

+7

Как очень ... C от вас :-) – paxdiablo

+1

Eheh я старая школа одна XD –

+2

Теперь вы забыли закрыть файл. : P – GManNickG

10

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

std::cout << '\n'; 

или

std::cout << "\n"; 

или

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

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

Если вы хотите, чтобы написать разделительную линию и промойте поток:

std::cout << std::endl; 

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

1

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

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

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

+1

Err ... это не STL, это iostreams. –

+0

Я согласен с BillyONeal. Кроме того, когда вы просто хотите '' \ n'', просто напишите '' \ n'', а не 'std :: endl'. Я однажды видел ускорение в 8 раз после замены ненужного 'std :: endl' на' '\ n''. – sbi

+0

О, я не знал, что это отдельные сущности. Я просто предположил, что они, потому что они разделяют пространство имен. Спасибо за исправление. – dimatura

1

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

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

Смежные вопросы