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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 5.00
Riderik
28 / 28 / 1
Регистрация: 24.07.2011
Сообщений: 171
#1

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

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

Добрый день. Начал писать одну программу в 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++
Здравствуйте. Возникло несколько вопросов: 1. Когда нажимаешь на определённую клавишу происходит определённое действие (типа меню)...Я на...

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

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

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

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

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

Графический редактор. Несколько вопросов - C++
Здравствуйте! Нам в вузе преподаватель дал мне курсовую графический редактор (GIF). На любом языке. Я пока думаю между C++ и Delphi. Но...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ValeryLaptev
Эксперт С++
1039 / 818 / 48
Регистрация: 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'
Gepar
1175 / 531 / 20
Регистрация: 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, далее Вам надо будет перенести с неё данные.
Riderik
28 / 28 / 1
Регистрация: 24.07.2011
Сообщений: 171
24.07.2011, 15:16  [ТС]     Несколько вопросов #4
Спасибо большое за помощь. Буду пробовать. Одно что не совсем понял насчет второго пункта:
2. Выводить порциями по несколько строк и ждать ответа пользователя. Если первую строку надо постоянно держать, то ее надо с каждой порцией выводить в начале.
Нужно чтобы, когда список вывелся полностью, юзер видел верхушку этого списка. Если это реально, не отказался бы от кода на примере массива из N строк.
OstapBender
583 / 521 / 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
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
Эксперт С++
1039 / 818 / 48
Регистрация: 30.04.2011
Сообщений: 1,659
24.07.2011, 16:28     Несколько вопросов #8
Цитата Сообщение от Riderik Посмотреть сообщение
Спасибо большое за помощь. Буду пробовать. Одно что не совсем понял насчет второго пункта:

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

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

-=ЮрА=-, ну что вы такое пишете для совсем ЗЕЛЕНОГО НОВИЧКА...
Не совсем зеленый новичок, я бы сказал. Всем спасибо
OstapBender
583 / 521 / 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
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
28 / 28 / 1
Регистрация: 24.07.2011
Сообщений: 171
24.07.2011, 21:00  [ТС]     Несколько вопросов #16
Спасибо. Еще вопрос: как удалить определенную строку в текстовом файле? (Т.е. найти эту строку в файле и сделать так, чтобы ее там не было)
Bers
Заблокирован
24.07.2011, 21:11     Несколько вопросов #17
Цитата Сообщение от 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++
Здравствуйте! Мне интересны следующие вопросы: 1. Где лучше объявить переменные нужные на протяжении всей работы программы? Например...

Несколько вопросов по основам программирования - C++
Вот дали вопросы по С++ ,но точного ответа так и не нашел!! Может вы чем то поможете или дадите сылочку на них!! Вот сами вопросы!! ...

Шаблоны классов: контейнер. Несколько вопросов - C++
Задача: постоить класс контейнера, параметризовать его, создать вектор с заданным вручную типом. Определил произвольный класс для...

Сортировка по алфавиту и еще несколько вопросов по С++ - C++
Срочно нужна помощь. 1) Нужно отсортировать по алфавиту массив из n элементов класса string. 2) Как вывести число с определенным...


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

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

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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru