28 / 28 / 4
Регистрация: 24.07.2011
Сообщений: 171
1

Несколько вопросов

24.07.2011, 14:50. Показов 2307. Ответов 24
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый день. Начал писать одну программу в VS 2008 C++ (консоль) и столкнулся в несколькими проблемами. В общем желательно нужно, чтобы программа при запуске открывалась в окне размерами больше стандартных 80x25. Функция window( int, int, int, int) не работает. Далее в программе будут выводиться длинный список, выходящий за границы по вертикали. Как сделать, чтобы при выводе этого списка консольное окно автоматически не прокручивалось вниз или чтобы в итоге видна была первая строка списка? И последний вопрос: как считать с текстового файла строку в массив символов (строка) до определенного символа (например например считать строку "Hello world!" в один массив до знака перехода на следующую строку)?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
24.07.2011, 14:50
Ответы с готовыми решениями:

Несколько вопросов
Делаю небольшую консольную игру для тренировки и есть несколько вопросов. char *lev; //char lev; ...

Несколько вопросов
Здравствуйте. Возникло несколько вопросов: 1. Когда нажимаешь на определённую клавишу происходит...

Несколько вопросов по указателям.
Добрый день. Не получается до конца разобраться с указателями, потому есть несколько вопросов. Кому...

Несколько вопросов к программистам.
Доброго времени суток! я начинающий, последние пару месяцев делал упор на изучение Си, WinAPI и...

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

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

3. Читай функцию getline() для строк. Там третий параметр - символ ограничитель. По умолчанию - как раз '\n'
1
1186 / 542 / 78
Регистрация: 01.07.2009
Сообщений: 3,517
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, далее Вам надо будет перенести с неё данные.
1
28 / 28 / 4
Регистрация: 24.07.2011
Сообщений: 171
24.07.2011, 15:16  [ТС] 4
Спасибо большое за помощь. Буду пробовать. Одно что не совсем понял насчет второго пункта:
2. Выводить порциями по несколько строк и ждать ответа пользователя. Если первую строку надо постоянно держать, то ее надо с каждой порцией выводить в начале.
Нужно чтобы, когда список вывелся полностью, юзер видел верхушку этого списка. Если это реально, не отказался бы от кода на примере массива из N строк.
0
594 / 532 / 76
Регистрация: 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);
2
28 / 28 / 4
Регистрация: 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);
Это в какой библиотеке ?
0
Заблокирован
Автор 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);
}
1
Эксперт С++
1069 / 848 / 60
Регистрация: 30.04.2011
Сообщений: 1,659
24.07.2011, 16:28 8
Цитата Сообщение от Riderik Посмотреть сообщение
Спасибо большое за помощь. Буду пробовать. Одно что не совсем понял насчет второго пункта:

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

Добавлено через 47 секунд
-=ЮрА=-, ну что вы такое пишете для совсем ЗЕЛЕНОГО НОВИЧКА...
0
1186 / 542 / 78
Регистрация: 01.07.2009
Сообщений: 3,517
24.07.2011, 16:55 9
-=ЮрА=-, так в Вашем примере размер окошка не меняется, часы то идут в одной строке, но им то места больше не надо, а так размер окошка для консоли всё равно стандартный получается.
0
935 / 760 / 299
Регистрация: 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;
}
1
28 / 28 / 4
Регистрация: 24.07.2011
Сообщений: 171
24.07.2011, 17:48  [ТС] 11
Цитата Сообщение от ValeryLaptev Посмотреть сообщение

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



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

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

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

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

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

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

Если хотите узнать об этом побольше, смотрите в сторону баз данных.
Но сейчас, на вашем уровне вам полноценную БД делать пока ещё рановато.
0
28 / 28 / 4
Регистрация: 24.07.2011
Сообщений: 171
24.07.2011, 21:27  [ТС] 20
Цитата Сообщение от Bers Посмотреть сообщение
А вы попробуйте, узнаете))
Я сомневаюсь, что у вас один текстовый файл на миллион текстовых строк, в котором нужно делать быстрый поиск/вставку/удаление

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

Если хотите узнать об этом побольше, смотрите в сторону баз данных.
Но сейчас, на вашем уровне вам полноценную БД делать пока ещё рановато.
Вообще-то в следующем семестре как раз их и изучаем
0
24.07.2011, 21:27
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.07.2011, 21:27
Помогаю со студенческими работами здесь

Несколько вопросов по строкам в С
Привет всем участникам форума. Изучаю С++, по пути прошел строки из С ( массивы символов ) И...

Несколько вопросов по извучению C++
Добрый день, товарищи!! Я немного новичек в вопросах программирования на C++, поэтому прошу...

Графический редактор. Несколько вопросов
Здравствуйте! Нам в вузе преподаватель дал мне курсовую графический редактор (GIF). На любом...

Несколько вопросов про массив
Добрый день, было задание написать программку, которая бы подсчитывала количество элементов в...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru