Форум программистов, компьютерный форум CyberForum.ru

Странный вывод cout - C++

Восстановить пароль Регистрация
 
Esvstn
0 / 0 / 0
Регистрация: 16.05.2014
Сообщений: 4
16.05.2014, 17:13     Странный вывод cout #1
Здравствуйте. Я обнаружил внезапно, что у меня как-то очень выборочно работает cout. Вод код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>                                                                                                                                          
#include <unistd.h>                                                                                                                                          
using namespace std;                                                                                                                                         
                                                                                                                                                                                                                                                                                                    
int main()                                                                                                                                                   
{                                                                                                                                                            
cout<<"This is LED => ";
    while(1)
    {
        static int flag = 0;
        if (flag)
        {
            cout<<"*";
            flag=0;
        }else
        {
            cout<<" ";
            flag=1;
        }
        sleep(1);
    }
    return 0;
}
Компилирую с помощью g++ version 4.8.1. В результате ничего не выводится. Совсем ничего. Теперь добавляю в цикле переносы строк:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
#include <unistd.h>
using namespace std;
 
int main()
{
cout<<"This is LED => ";
    while(1)
    {
        static int flag = 0;
        if (flag)
        {
            cout<<"*"<<endl;
            flag=0;
        }else
        {
            cout<<" "<<endl;
            flag=1;
        }
        sleep(1);
    }
    return 0;
}
И вывод начинает работать! Все ок. Проблема в том, что мне не нужен переход каретки, я хочу, чтобы у меня звездочка в той же строчке мигала. Помогите, почему такое может быть и как можно попробовать решить проблему? Кстати, на MinGW 4.4 все работает как и ожидалось.
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.05.2014, 17:13     Странный вывод cout
Посмотрите здесь:

C++ Вывод в cout
странный порядок вывода cout C++
C++ Интересный вывод, инкремент и декремент в cout
C++ Странный вывод
Странный вывод printf C++
Пятнашки не работают. Вывод с cout C++
C++ Странный вывод оператором cout
C++ Вывод string в cout

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ilot
Модератор
Эксперт С++
1767 / 1142 / 223
Регистрация: 16.05.2013
Сообщений: 3,020
Записей в блоге: 5
Завершенные тесты: 1
16.05.2014, 17:59     Странный вывод cout #2
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Дело в том что данные которые вы передаете в поток буферезуются. Т.е. все данные сперва помещаются в буфер где храняться до тех пор пока не наступит событие заставляющее буфер сбросить свое содержимое в устройство вывода то бишь в консоль.
Принудительно сбросить содержимое буфера можно несколькими способами:
-явно дать команду опустошить буфер:
C++
1
cout.flish
Вот на нем и остановимся.
Так вот манипулятор endl не просто переводит каретку на новую строку, но и дает команду потоку освободить свой буфер. Примерная реализация этого манипулятора может иметь такой вид:
C++
1
2
3
4
  template<typename _CharT, typename _Traits>
    inline basic_ostream<_CharT, _Traits>&
    endl(basic_ostream<_CharT, _Traits>& __os)
    { return flush(__os.put(__os.widen('\n'))); }
Как видете сперва в поток помещается управляющий символ '\n', а затем командой flush освобождается буфер.
Теперь если вы не даете команду потоку освободить буфер данные которые вы будете в него помещать остануться в буфере до тех пор пока не возникнет необходимость сбросить его содержимое в консоль. Это происходи также при переполнении буфера либо при использовании потока cin так как они связанны между собой.
В вашем пером коде как раз таки и отсутствует управляющие конструкции сбрасывающие буфер вот поэтому данные накапливаются в памяти и не выводятся на консоль.
Попробуйте запустить вот этот код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
#include <unistd.h>
using namespace std;
int main()
{
  cout<<"This is LED => ";
  int k = 0;
    while(k < 10){
        static int flag = 0;
        if (flag){
            cout<<"*";
            flag=0;
        }
        else {
            cout<<" ";
            flag=1;
        }
        sleep(1);
        ++k;
    }
    cout << endl;
    return 0;
}
Теоретически вывод должен произойти только при выходе их цикла. Однако у меня буфер очищается на каждом тике. Может у вас будет вывод только при выходе из цикла...
Esvstn
0 / 0 / 0
Регистрация: 16.05.2014
Сообщений: 4
18.05.2014, 02:34  [ТС]     Странный вывод cout #3
Огромное спасибо за объяснение!
Yandex
Объявления
18.05.2014, 02:34     Странный вывод cout
Ответ Создать тему
Опции темы

Текущее время: 16:26. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru