endl и очистка буфера

Используя IList от Библиотека Универсального набора C5 , Обратное повторение является функцией, а не расширением:

foreach (var i in list.Reverse())
{
}

Также, можно использовать Shuffle() метод для получения случайного упорядочивания:

var listClone = (IList) list.Clone();
listClone.Shuffle();
foreach (var i in listClone)
{
}

30
задан jww 7 January 2016 в 23:17
поделиться

2 ответа

При использовании std::cout операнд, используемый после оператора вывода (<<), сохраняется в буфере и не отображается на stdin (обычно терминале или командной строке), пока не встретит std::endl или std::cin, что приводит к очистке буфера , в том смысле, что отображает / выводит содержимое буфера на stdin.

Рассмотрим эту программу:

#include <iostream>
#include <unistd.h>

int main(void)
{
    std::cout << "Hello, world";
    sleep(2);
    std::cout << std::endl;

    return 0;
}

Полученный результат будет:

через 2 секунды

Hello, World

1
ответ дан 27 November 2019 в 23:39
поделиться

C ++ iostreams буферизуются, это означает, что когда вы выводите в ostream, контент не будет сразу переходить к тому, что находится за потоком, например, стандартный выход в случае cout. Реализация потока определяет, когда фактически отправлять буферизованную часть потока. Это сделано из соображений эффективности, было бы очень неэффективно записывать байты в байты сети или диска, поскольку буферизация решает эту проблему.

Это, однако, означает, что когда вы записываете, скажем, отладочные сообщения в файл журнала, и ваша программа падает, вы можете потерять часть данных, записанных вами в файл журнала, через поток, так как часть журнала все еще может находиться в буфер потока и еще не записан в фактический файл. Чтобы этого не происходило, вам нужно заставить поток очищать свои буферы либо с помощью явного вызова метода flush, либо с помощью удобства endl.

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

Отредактировано, чтобы включить эту заметку:

У cin и cout есть особые отношения, при которых чтение из cin автоматически сбрасывает cout заранее. Это гарантирует, что, например, подсказка, которую вы написали cout, будет фактически видна пользователю до того, как чтение из cin будет ожидать ввода. Следовательно, даже в cout вам обычно не нужен endl, но вместо этого вы можете использовать \ n. Вы также можете создавать такие отношения между другими потоками, связывая их вместе.

20
ответ дан 27 November 2019 в 23:39
поделиться
Другие вопросы по тегам:

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