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

подружить cout с консольным буфером - C++

Восстановить пароль Регистрация
 
Bers
Заблокирован
06.12.2011, 20:18     подружить cout с консольным буфером #1
Перерыл все интернеты, нигде ничего вразумительного не нашёл:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <windows.h>
#include <iostream>
 
int main()
{
    //создаю новый консольный буффер
    HANDLE FirstScreenBuffer= CreateConsoleScreenBuffer(
        GENERIC_READ | GENERIC_WRITE,
        0,
        NULL,
        CONSOLE_TEXTMODE_BUFFER,
        NULL  );
    
    //Активирую его. 
    //Теперь консолька будит писать данные в новый буфер
    SetConsoleActiveScreenBuffer(FirstScreenBuffer);
 
    //соотвественно кауты теперь отправляют данные в никуда
    std::cout<< "ля ля ля\n";  //вывод: квадрат Малевича
    EndProgramm();
}
Как подружить кауты с новым консольным буфером?
Единственный способ, который я знаю - создание дополнительных потоков,
и перехват/перенаправление стандартных потоков вывода.

Но это тяжко... Может быть есть какой нибудь способ попроще?

Добавлено через 6 часов 56 минут
В общем, решение было найдено)

Вот здесь статья о том, как на самом деле си-потоки, и с++-потоки связываются с буфером консольки виндовс. И какие могут быть с этим проблемы.
стандартные потоки ввода/выводы и консоль


В статье есть несколько примеров, как можно перенаправлять потоки вводы/выводы, без всякого шаманства вокруг многопоточного программирования.

И если кому нибудь будит интересно, то вот готовое рабочее решение моей проблемы:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#include <windows.h>
#include <stdio.h>
#include <fcntl.h>
#include <io.h>
#include <iostream>
#include <fstream>
 
void RedirectIOToConsole() //перенаправление стандартных потоков в нововый консольный буффер
{
    int hConHandle; long lStdHandle; FILE *fp;
 
    // redirect unbuffered STDOUT to the console
    lStdHandle = (long)GetStdHandle(STD_OUTPUT_HANDLE);
    hConHandle = _open_osfhandle(lStdHandle, _O_TEXT);
    fp = _fdopen( hConHandle, "w" );
    *stdout = *fp;
    setvbuf( stdout, NULL, _IONBF, 0 );
 
    // redirect unbuffered STDIN to the console
    lStdHandle = (long)GetStdHandle(STD_INPUT_HANDLE);
    hConHandle = _open_osfhandle(lStdHandle, _O_TEXT);
    fp = _fdopen( hConHandle, "r" );
    *stdin = *fp;
    setvbuf( stdin, NULL, _IONBF, 0 );
 
    // redirect unbuffered STDERR to the console
    lStdHandle = (long)GetStdHandle(STD_ERROR_HANDLE);
    hConHandle = _open_osfhandle(lStdHandle, _O_TEXT);
    fp = _fdopen( hConHandle, "w" );
    *stderr = *fp;
    setvbuf( stderr, NULL, _IONBF, 0 );
 
    // make cout, wcout, cin, wcin, wcerr, cerr, wclog and clog
    // point to console as well
    std::ios::sync_with_stdio();
}
 
 
int main()
{
    //создаю новый консольный буффер, какой мне нужно
    HANDLE FirstScreenBuffer= CreateConsoleScreenBuffer( GENERIC_READ | GENERIC_WRITE,0,NULL,CONSOLE_TEXTMODE_BUFFER,NULL );
    
    //активирую его. Теперь консолька на него настроилась 
    SetConsoleActiveScreenBuffer(FirstScreenBuffer);
    
    int res= SetStdHandle(  STD_OUTPUT_HANDLE , FirstScreenBuffer);
    
    RedirectIOToConsole(); //перенастраиваю стандартные потоки ввода/вывода
    
    std::cout<< "ля ля ля\n"; //вывод: ля ля ля
    EndProgramm();
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.12.2011, 20:18     подружить cout с консольным буфером
Посмотрите здесь:

cout vs. std::cout C++
C++ Реализация 2х потоков, работа с буфером, механизм семафоров
C++ Терпеливая сортировка с обычным буфером
C++ Очередь с кольцевым буфером
C++ Работа с консольным окном
cout.setf и cout.precision C++
C++ Интернет радио, как осуществить работу с буфером?
В чем разница std::cout и просто cout? C++

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

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

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