Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Найти все корни уравнения на заданном интервале [a;b] с заданной точностью http://www.cyberforum.ru/cpp-beginners/thread400112.html
Закрепление практических навыков по работе с функциями. В ходе выполнения работы необходимо создать программу, которая находит все корни уравнения на заданном интервале с заданной точностью ...
C++ двухмерный массив доработать и исправить Задание:Коэффициенты системы линейных уравнений заданы в виде прямоугольной матрицы. С помощью допустимых преобразований привести систему к треугольному виду. Найти количество строк, среднее... http://www.cyberforum.ru/cpp-beginners/thread400093.html
Произведение и сумма C++
Здравствуйте! Помогите пожалуйста с задачей. Никак не могу понять как это осуществить и в циклах что за чем запуталась =( Дан вот такой пример: http://s012.***********/i319/1112/8b/a5ee940baf85.jpg...
C++ Реализовать односвязный список, элементы которого содержат целые числа
1.1 «Список I». Реализовать односвязный список, элементы которого содержат целые числа. Реализовать при этом функции list_new() (создать новый список), list_delete(l) (удалить список l и все его...
C++ [C++] Решите за меня задачи на файлы http://www.cyberforum.ru/cpp-beginners/thread400070.html
1) Дан файл f, компоненты которого являются действительными... найти сумму первого и последнего компонента. 2) Дано целое число К и файл, содержащий неотрицательные целые числа. Вывести К-й элемент...
C++ Битовые операции, n-ый бит Подскажите, пожалуйста! Дано число x. Как установить на место n-ого бита единицу? Вот, что скомпоновала из найденного.. но тут неправильный результат. Вместо 7 из числа 5 получается число 2. nt... подробнее

Показать сообщение отдельно
Bers
Заблокирован

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

06.12.2011, 20:18. Просмотров 1018. Ответов 0
Метки (Все метки)

Перерыл все интернеты, нигде ничего вразумительного не нашёл:

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();
}
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru