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

Несколько вопросов - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 5.00
Riderik
 Аватар для Riderik
28 / 28 / 1
Регистрация: 24.07.2011
Сообщений: 171
24.07.2011, 14:50     Несколько вопросов #1
Добрый день. Начал писать одну программу в VS 2008 C++ (консоль) и столкнулся в несколькими проблемами. В общем желательно нужно, чтобы программа при запуске открывалась в окне размерами больше стандартных 80x25. Функция window( int, int, int, int) не работает. Далее в программе будут выводиться длинный список, выходящий за границы по вертикали. Как сделать, чтобы при выводе этого списка консольное окно автоматически не прокручивалось вниз или чтобы в итоге видна была первая строка списка? И последний вопрос: как считать с текстового файла строку в массив символов (строка) до определенного символа (например например считать строку "Hello world!" в один массив до знака перехода на следующую строку)?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.07.2011, 14:50     Несколько вопросов
Посмотрите здесь:

Несколько вопросов по извучению C++ C++
несколько вопросов. WinApi C++
Несколько вопросов C++
Несколько вопросов про массив C++
Несколько вопросов по строкам в С C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ValeryLaptev
Эксперт C++
1004 / 783 / 46
Регистрация: 30.04.2011
Сообщений: 1,595
24.07.2011, 15:06     Несколько вопросов #2
Цитата Сообщение от Riderik Посмотреть сообщение
Добрый день. Начал писать одну программу в VS 2008 C++ (консоль) и столкнулся в несколькими проблемами. В общем желательно нужно, чтобы программа при запуске открывалась в окне размерами больше стандартных 80x25. Функция window( int, int, int, int) не работает. Далее в программе будут выводиться длинный список, выходящий за границы по вертикали. Как сделать, чтобы при выводе этого списка консольное окно автоматически не прокручивалось вниз или чтобы в итоге видна была первая строка списка? И последний вопрос: как считать с текстового файла строку в массив символов (строка) до определенного символа (например например считать строку "Hello world!" в один массив до знака перехода на следующую строку)?
1. Щелкни правой кнопкой мыши на заголовке консольного окна. В контекстном меню есть Свойства. Туда войдешь, там установишь. Не забудь сохранить для всех окон. И не забудь установить буфер - там в свойствах увидишь

2. Выводить порциями по несколько строк и ждать ответа пользователя. Если первую строку надо постоянно держать, то ее надо с каждой порцией выводить в начале.

3. Читай функцию getline() для строк. Там третий параметр - символ ограничитель. По умолчанию - как раз '\n'
Gepar
 Аватар для Gepar
1173 / 529 / 20
Регистрация: 01.07.2009
Сообщений: 3,508
24.07.2011, 15:09     Несколько вопросов #3
Цитата Сообщение от Riderik Посмотреть сообщение
как считать с текстового файла строку в массив символов (строка) до определенного символа (например например считать строку "Hello world!" в один массив до знака перехода на следующую строку)?
C++
1
2
3
4
    ifstream f("file.txt");
    string s;
    getline(f,s);
    cout<<s;
Это правда будет чтение в обычную строку string, далее Вам надо будет перенести с неё данные.
Riderik
 Аватар для Riderik
28 / 28 / 1
Регистрация: 24.07.2011
Сообщений: 171
24.07.2011, 15:16  [ТС]     Несколько вопросов #4
Спасибо большое за помощь. Буду пробовать. Одно что не совсем понял насчет второго пункта:
2. Выводить порциями по несколько строк и ждать ответа пользователя. Если первую строку надо постоянно держать, то ее надо с каждой порцией выводить в начале.
Нужно чтобы, когда список вывелся полностью, юзер видел верхушку этого списка. Если это реально, не отказался бы от кода на примере массива из N строк.
OstapBender
 Аватар для OstapBender
581 / 519 / 35
Регистрация: 22.03.2011
Сообщений: 1,585
24.07.2011, 15:22     Несколько вопросов #5
Цитата Сообщение от Riderik Посмотреть сообщение
Нужно чтобы, когда список вывелся полностью, юзер видел верхушку этого списка.
C
1
2
3
    HANDLE hnd = ::GetStdHandle(STD_OUTPUT_HANDLE);
    COORD c = {0,0};
    ::SetConsoleCursorPosition(hnd,c);
Riderik
 Аватар для Riderik
28 / 28 / 1
Регистрация: 24.07.2011
Сообщений: 171
24.07.2011, 15:32  [ТС]     Несколько вопросов #6
Цитата Сообщение от OstapBender Посмотреть сообщение
C
1
2
3
    HANDLE hnd = ::GetStdHandle(STD_OUTPUT_HANDLE);
    COORD c = {0,0};
    ::SetConsoleCursorPosition(hnd,c);
Это в какой библиотеке ?
-=ЮрА=-
Заблокирован
Автор FAQ
24.07.2011, 15:35     Несколько вопросов #7
Задать размеры окна можно функцией MoveWindow, для вывода текста на одном и том же месте необходимо обращение к буфферу консоли, посмотри этот проект - это консольные часы которые идут в одной строке
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
54
55
#include <windows.h>
#include <stdio.h>
#include <time.h>
 
time_t t;
 
void CleanScreen(COORD POOS);
void ShowTime();
 
int main()
{
    SetConsoleTitle("timer");
    HWND hWnd = FindWindow(NULL,"timer");
    if(hWnd)
        MoveWindow(hWnd,0,0,220,80,true);
    while(true)
    {
        ShowTime();
        Sleep(100);
    }
    return 0;
}
 
void CleanScreen(COORD POS)
{
    HANDLE hOutput = GetStdHandle(STD_OUTPUT_HANDLE);
    CONSOLE_SCREEN_BUFFER_INFO SCRN_INFO;
    GetConsoleScreenBufferInfo(hOutput, &SCRN_INFO);
    
    FillConsoleOutputCharacter(hOutput, ' ',
    SCRN_INFO.dwSize.X*SCRN_INFO.dwSize.Y, POS, NULL);
    FillConsoleOutputAttribute(hOutput, 
        FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE /*????*/, 
        SCRN_INFO.dwSize.X*SCRN_INFO.dwSize.Y,POS,NULL);
 
    SetConsoleTextAttribute(hOutput,FOREGROUND_GREEN|FOREGROUND_INTENSITY);
    SetConsoleCursorPosition(hOutput,POS);
    //printf("CONSOLE HANDLE 0x%p",hOutput);
}
 
void ShowTime()
{
    COORD POS;
    POS.X = 0;POS.Y = 0;
    CleanScreen(POS);
    CONSOLE_SCREEN_BUFFER_INFO SCRN_INFO;
 
    time(&t);
    tm * plocal = localtime(&t);
    printf("%s",asctime(plocal));
    GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &SCRN_INFO);
    POS.X = 0;
    POS.Y = SCRN_INFO.dwCursorPosition.Y;
    CleanScreen(POS);
}
ValeryLaptev
Эксперт C++
1004 / 783 / 46
Регистрация: 30.04.2011
Сообщений: 1,595
24.07.2011, 16:28     Несколько вопросов #8
Цитата Сообщение от Riderik Посмотреть сообщение
Спасибо большое за помощь. Буду пробовать. Одно что не совсем понял насчет второго пункта:

Нужно чтобы, когда список вывелся полностью, юзер видел верхушку этого списка. Если это реально, не отказался бы от кода на примере массива из N строк.
Размер окна все равно упирается в размеры экрана. Поэтому если список длинный, то он по-любому весь не поместится в окно. Поэтому надо порциями выводить.
Но если тебе все же нужно видеть именно ПЕРВУЮ строку, то ее надо вместо с порцией выводить первой.

Добавлено через 47 секунд
-=ЮрА=-, ну что вы такое пишете для совсем ЗЕЛЕНОГО НОВИЧКА...
Gepar
 Аватар для Gepar
1173 / 529 / 20
Регистрация: 01.07.2009
Сообщений: 3,508
24.07.2011, 16:55     Несколько вопросов #9
-=ЮрА=-, так в Вашем примере размер окошка не меняется, часы то идут в одной строке, но им то места больше не надо, а так размер окошка для консоли всё равно стандартный получается.
xAtom
 Аватар для xAtom
910 / 735 / 60
Регистрация: 09.12.2010
Сообщений: 1,346
Записей в блоге: 1
24.07.2011, 17:38     Несколько вопросов #10
Цитата Сообщение от Gepar Посмотреть сообщение
так в Вашем примере размер окошка не меняется
Вот изменение консольного окошка
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
#include <windows.h>
#include <stdio.h>
 
 
int main(int argc, char* argv[]) {
 
    HANDLE sout = GetStdHandle(STD_OUTPUT_HANDLE);
 
    CONSOLE_SCREEN_BUFFER_INFO  info;
    ZeroMemory(&info, sizeof(CONSOLE_SCREEN_BUFFER_INFO));
    GetConsoleScreenBufferInfo(sout, &info);
 
    COORD size = { info.dwSize.X * 2, info.dwSize.Y };  // расширем по-горизонтали
    SetConsoleScreenBufferSize(sout, size);
 
 
    HWND wnd = GetForegroundWindow();
    tagRECT  rect;
    GetWindowRect(wnd, &rect);
 
    // вот собственно сам код изменения размера и позиции консоля, меняй как хочешь
    SetWindowPos(wnd, HWND_TOPMOST, rect.left, rect.top,
                   rect.left + (rect.right  - rect.left) + 200,
                   rect.top  + (rect.bottom - rect.top)  + 200,
                   SWP_SHOWWINDOW);
 
    BringWindowToTop(wnd);  
 
 
   getchar();
   return 0;
}
Riderik
 Аватар для Riderik
28 / 28 / 1
Регистрация: 24.07.2011
Сообщений: 171
24.07.2011, 17:48  [ТС]     Несколько вопросов #11
Цитата Сообщение от ValeryLaptev Посмотреть сообщение

-=ЮрА=-, ну что вы такое пишете для совсем ЗЕЛЕНОГО НОВИЧКА...
Не совсем зеленый новичок, я бы сказал. Всем спасибо
OstapBender
 Аватар для OstapBender
581 / 519 / 35
Регистрация: 22.03.2011
Сообщений: 1,585
24.07.2011, 19:10     Несколько вопросов #12
Цитата Сообщение от Riderik Посмотреть сообщение
Это в какой библиотеке ?
ВНЕЗАПНО windows.h
-=ЮрА=-
Заблокирован
Автор FAQ
24.07.2011, 19:24     Несколько вопросов #13
Цитата Сообщение от Gepar Посмотреть сообщение
-=ЮрА=-, так в Вашем примере размер окошка не меняется, часы то идут в одной строке, но им то места больше не надо, а так размер окошка для консоли всё равно стандартный получается.
Окошко в программе меняется програмно функцией MoveWindow - и то что окошко именно по часикам - результат подбора размеров окна 220 на 80
C++
1
MoveWindow(hWnd,0,0,220,80,true);
- дальше пользователь сам должен решить что и как ему изменять, за вывод текста согласен для новичка немножко сложновато, но по другому в буффер консоли как залезать то?
Riderik
 Аватар для Riderik
28 / 28 / 1
Регистрация: 24.07.2011
Сообщений: 171
24.07.2011, 20:39  [ТС]     Несколько вопросов #14
А как вводить текст на русском? Я использую функцию setlocale( LC_ALL , "Russian"); , чтобы в коде распознавал кириллицу, но с этой функцией при вводе русской строки в консоль, выводится она неадекватно. Например при вводе "Привет" выведется "?аЁу?в"
Bers
Заблокирован
24.07.2011, 20:50     Несколько вопросов #15
если новичок хочет врубится в прелести консоли, то вот здесь он найдёт массу интересного:
http://vsokovikov.narod.ru/New_MSDN_...ole/con_fn.htm



Цитата Сообщение от Riderik Посмотреть сообщение
А как вводить текст на русском?
Я делаю вот так:

SetConsoleOutputCP(1251); SetConsoleCP(1251); //не удалять! Русский букв!!!

Запускаете консольное приложение, потом тыкаете на свойство консоли, и в выпавшем меню выбираете шрифт для консоли под названием Lucidia Console

Делаете "применить для всех окон"

/ps консоль будит выводить русские буквы правильно, вместо кракозябр. Вводятся же буквы априори правильные)
Riderik
 Аватар для Riderik
28 / 28 / 1
Регистрация: 24.07.2011
Сообщений: 171
24.07.2011, 21:00  [ТС]     Несколько вопросов #16
Спасибо. Еще вопрос: как удалить определенную строку в текстовом файле? (Т.е. найти эту строку в файле и сделать так, чтобы ее там не было)
Bers
Заблокирован
24.07.2011, 21:11     Несколько вопросов #17
Цитата Сообщение от Riderik Посмотреть сообщение
Спасибо. Еще вопрос: как удалить определенную строку в текстовом файле? (Т.е. найти эту строку в файле и сделать так, чтобы ее там не было)
Самый простой вариант - прочитать весь файл целиком в буфер. Потом с буфером можно делать все что угодно. Вырезать из него строки, добавлять новые... В конце всех операций - залить обратно в файл в режиме "перезапись".
Riderik
 Аватар для Riderik
28 / 28 / 1
Регистрация: 24.07.2011
Сообщений: 171
24.07.2011, 21:14  [ТС]     Несколько вопросов #18
Цитата Сообщение от Bers Посмотреть сообщение
Самый простой вариант - прочитать весь файл целиком в буфер. Потом с буфером можно делать все что угодно. Вырезать из него строки, добавлять новые... В конце всех операций - залить обратно в файл в режиме "перезапись".
Ну этот вариант я знал. А он не слишком объемный будет для большого списка?
Bers
Заблокирован
24.07.2011, 21:25     Несколько вопросов #19
Цитата Сообщение от Riderik Посмотреть сообщение
Ну этот вариант я знал. А он не слишком объемный будет для большого списка?
А вы попробуйте, узнаете))
Я сомневаюсь, что у вас один текстовый файл на миллион текстовых строк, в котором нужно делать быстрый поиск/вставку/удаление

А вообще, никто не хранит миллионы обычных строк в текстовых файлах.
Для этого используются особые форматы хранения данных. При которых данные индексируются хитрым способом, разбиваются на разные кусочки, что бы их было легче искать/модифицировать, ну и тп.

Если хотите узнать об этом побольше, смотрите в сторону баз данных.
Но сейчас, на вашем уровне вам полноценную БД делать пока ещё рановато.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.07.2011, 21:27     Несколько вопросов
Еще ссылки по теме:

C++ Несколько вопросов по указателям.
C++ Несколько вопросов
Несколько вопросов к программистам. C++

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

Или воспользуйтесь поиском по форуму:
Riderik
 Аватар для Riderik
28 / 28 / 1
Регистрация: 24.07.2011
Сообщений: 171
24.07.2011, 21:27  [ТС]     Несколько вопросов #20
Цитата Сообщение от Bers Посмотреть сообщение
А вы попробуйте, узнаете))
Я сомневаюсь, что у вас один текстовый файл на миллион текстовых строк, в котором нужно делать быстрый поиск/вставку/удаление

А вообще, никто не хранит миллионы обычных строк в текстовых файлах.
Для этого используются особые форматы хранения данных. При которых данные индексируются хитрым способом, разбиваются на разные кусочки, что бы их было легче искать/модифицировать, ну и тп.

Если хотите узнать об этом побольше, смотрите в сторону баз данных.
Но сейчас, на вашем уровне вам полноценную БД делать пока ещё рановато.
Вообще-то в следующем семестре как раз их и изучаем
Yandex
Объявления
24.07.2011, 21:27     Несколько вопросов
Ответ Создать тему
Опции темы

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