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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 39, средняя оценка - 4.90
VLK
193 / 162 / 12
Регистрация: 05.05.2013
Сообщений: 1,225
#1

getline, string, запись в файл, русский язык - C++

12.08.2013, 15:27. Просмотров 5673. Ответов 20
Метки нет (Все метки)

Кликните здесь для просмотра всего текста
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
#include <iostream> 
using std::ios;
using std::cin;
using std::cout;
using std::endl;
 
#include <string>
using std::string;
 
#include <fstream>
using std::ofstream;
using std::ifstream;
 
 
int main()
{
setlocale(LC_ALL,"");
 
ofstream MyFile("MyFile.txt", ios::out);
 
int sum;
string name;
 
cout << "Введите сумму: ";
cin >> sum;
cout << "Введите имя: ";
std::getline(cin, name);
 
MyFile << sum << endl;
MyFile << name << endl;
 
MyFile.close();
 
system("pause");
return 0;
}


Подскажите, программа компилируется, запускается, ввожу сумму, потом когда предлагает ввести имя, программа сам ввод пропускает, т.е. выводит на экран "Введите имя: " а сразу после этого "Для продолжения нажмите любую клавишу" (за счет system("pause")) в чем косяк?

И еще несколько вопрос, в чем разница между get() и getline() ? этот вопрос мне по ночам спать не дает
И еще, подскажите, как мне записать в файл string на русском языке?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alsav22
5416 / 4812 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
12.08.2013, 15:31     getline, string, запись в файл, русский язык #2
Цитата Сообщение от VLK Посмотреть сообщение
ввожу сумму, потом когда предлагает ввести имя, программа сам ввод пропускает,
Везде, где есть cin >>, используйте такое:
C++
1
(cin >> sum).get();
VLK
193 / 162 / 12
Регистрация: 05.05.2013
Сообщений: 1,225
12.08.2013, 15:39  [ТС]     getline, string, запись в файл, русский язык #3
Я не совсем понял (и явно не я в этом виноват), т.е. из-за строчки 25 ( cin >> sum ) у меня строчка 27 ( std::getline(cin, name) ) не работает?
alsav22
5416 / 4812 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
12.08.2013, 15:40     getline, string, запись в файл, русский язык #4
Цитата Сообщение от VLK Посмотреть сообщение
в чем разница между get() и getline() ?
istream& get (char* s, streamsize n);
Если символ вообще не извлекается (например, сразу конец файла), то
в строку ввода помещается '\0' и устанавливается failbit (и eofbit).
Если вводится больше, чем n - 1, то в конец строки ввода помещается '\0', флаг ошибки НЕ устанавливается (в отличие от getline(char* s, streamsize n)). Не введённое (вмесе с '\n') остаётся в очереди.
Если конец файла, то устанавливает eofbit. ВАЖНО!!! ПОТОК С УСТАНОВЛЕННЫМ eofbit, ОБРАБАТЫВАЕТСЯ УСЛОВНЫМИ ОПЕРАТОРАМИ КАК true. ЕСЛИ ЖЕ В ПОТОКЕ УСТАНОВЛЕН failbit ИЛИ badbit, ТО КАК false.
Если пустая строка (т.е., '\n' - первый), то чтение останавливается и устанавливается failbit(в отличие от getline(char* s, streamsize )), символ '\n' остаётся в очереди (в отличие от getline(char* s, streamsize n)), в строку ввода помещается '\0';
Если символ перевода строки('\n', но не первый), то чтение останавливается, в конец строки
помещается '\0', символ '\n' остаётся в очереди (в отличие от getline(char* s, streamsize n)), поэтому если дальше будет get (char* s, streamsize n), то установится failbit.

istream& getline(char* s, streamsize n);
Если символ вообще не извлекается (например, сразу конец файла), то
в строку ввода помещается '\0' и устанавливается failbit (и eofbit).
Если вводится больше, чем n - 1, то в конец строки ввода помещается '\0' и
устанавливает failbit. Не введённое остаётся в очереди.
Если конец файла, то устанавливается eofbit. ВАЖНО!!! ПОТОК С УСТАНОВЛЕННЫМ eofbit, ОБРАБАТЫВАЕТСЯ УСЛОВНЫМИ ОПЕРАТОРАМИ КАК true. ЕСЛИ ЖЕ В ПОТОКЕ УСТАНОВЛЕН failbit ИЛИ badbit, ТО КАК false.
Если пустая строка (т.е., '\n' - первый), то чтение останавливается,
символ '\n' извлекается из очереди (в отличие от get (char* s, streamsize n)), но не сохраняется, в строку ввода помещается '\0' . Флаг ошибки НЕ устанавливается (в отличие от get (char* s, streamsize n)). Не введённое остаётся в очереди. Если символ перевода строки('\n', но не первый), то чтение останавливается, в конец строки помещается '\0', символ '\n' извлекается из очереди (в отличие от get (char* s, streamsize n)), но не сохраняется.

Добавлено через 31 секунду
Цитата Сообщение от VLK Посмотреть сообщение
т.е. из-за строчки 25 ( cin >> sum ) у меня строчка 27 ( std::getline(cin, name) ) не работает?
Да.
Valentina
68 / 68 / 3
Регистрация: 13.05.2012
Сообщений: 130
12.08.2013, 15:42     getline, string, запись в файл, русский язык #5
Если перед cin.getline() был любой cin, то перед ним нужно поставить cin. ignore().
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
#include <iostream> 
using std::ios;
using std::cin;
using std::cout;
using std::endl;
 
#include <string>
using std::string;
 
#include <fstream>
using std::ofstream;
using std::ifstream;
 
 
int main()
{
setlocale (LC_ALL, ".1251"); // для ввода; 
 
 
ofstream MyFile("MyFile.txt", ios::out);
 
int sum;
string name;
 
cout << "Введите сумму: ";
cin >> sum;
cin.ignore();
cout << "Введите имя: ";
std::getline(cin, name);
setlocale (LC_ALL, ".866" ); // для вывода;
cout<<sum<<endl<<name<<endl;
 
MyFile << sum << endl;
MyFile << name << endl;
 
MyFile.close();
 
system("pause");
return 0;
}
VLK
193 / 162 / 12
Регистрация: 05.05.2013
Сообщений: 1,225
12.08.2013, 15:46  [ТС]     getline, string, запись в файл, русский язык #6
А по поводу русского языка?
alsav22
5416 / 4812 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
12.08.2013, 15:47     getline, string, запись в файл, русский язык #7
Цитата Сообщение от Valentina Посмотреть сообщение
setlocale (LC_ALL, ".1251"); // для ввода;
Это разве на ввод работает?
VLK
193 / 162 / 12
Регистрация: 05.05.2013
Сообщений: 1,225
12.08.2013, 15:47  [ТС]     getline, string, запись в файл, русский язык #8
Цитата Сообщение от alsav22 Посмотреть сообщение
Это разве на ввод работает?
В файл записывает каракули
alsav22
5416 / 4812 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
12.08.2013, 15:48     getline, string, запись в файл, русский язык #9
Цитата Сообщение от VLK Посмотреть сообщение
А по поводу русского языка?
C++
1
2
3
4
5
6
7
8
#include <windows.h>
 
int main()
{
  SetConsoleCP(1251);
  SetConsoleOutputCP(1251);
  ...
}
В свойствах консоли выбрать шрифт: Lucida Console
VLK
193 / 162 / 12
Регистрация: 05.05.2013
Сообщений: 1,225
12.08.2013, 16:00  [ТС]     getline, string, запись в файл, русский язык #10
Самый короткий (и простой) путь для записи в файл русскими буквами это:

C++
1
2
3
4
#include <windows.h>
 
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
В свойствах консоли выбрать шрифт: Lucida Console

более простых нет?

Добавлено через 1 минуту
И еще как я заметил, приходится при создании каждой программы (консольной) приходится в ручную устанавливать шрифт: Lucida Console, можно этот как то по другому сделать, например прописать в код программы параметр, что бы он автоматически устанавливал шрифт: Lucida Console
alsav22
5416 / 4812 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
12.08.2013, 16:06     getline, string, запись в файл, русский язык #11
Цитата Сообщение от VLK Посмотреть сообщение
И еще как я заметил, приходится при создании каждой программы (консольной) приходится в ручную устанавливать шрифт: Lucida Console,
Почему вам приходится, а, например, мне нет? ОС какая?

Добавлено через 59 секунд
Цитата Сообщение от VLK Посмотреть сообщение
более простых нет?
Недостаточно просто? Есть более сложные...
VLK
193 / 162 / 12
Регистрация: 05.05.2013
Сообщений: 1,225
12.08.2013, 16:10  [ТС]     getline, string, запись в файл, русский язык #12
Цитата Сообщение от alsav22 Посмотреть сообщение
Почему вам приходится, а, например, мне нет? ОС какая?
Windows 7
честно сказать я сейчас впервые переключил шрифт на указанный, до этого с подобным не сталкивался, не было потребности.

Я создаю проект в MS VS и у меня по умолчанию создается с такими настройками: getline, string, запись в файл, русский язык

как переделать?
VLK
193 / 162 / 12
Регистрация: 05.05.2013
Сообщений: 1,225
12.08.2013, 16:10  [ТС]     getline, string, запись в файл, русский язык #13
Цитата Сообщение от alsav22 Посмотреть сообщение
Недостаточно просто? Есть более сложные...
Я поинтересовался, мало ли..
alsav22
5416 / 4812 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
12.08.2013, 16:14     getline, string, запись в файл, русский язык #14
Цитата Сообщение от VLK Посмотреть сообщение
честно сказать я сейчас впервые переключил шрифт на указанный, до этого с подобным не сталкивался, не было потребности.
Как тогда понимать это?
Цитата Сообщение от VLK Посмотреть сообщение
И еще как я заметил, приходится при создании каждой программы (консольной) приходится в ручную устанавливать шрифт: Lucida Console,
Как вы могли это заметить, если шрифт не устанавливали?

Добавлено через 59 секунд
Цитата Сообщение от VLK Посмотреть сообщение
как переделать?
Один раз установите и будет стоять.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.08.2013, 16:22     getline, string, запись в файл, русский язык
Еще ссылки по теме:
C++ Запись string в бинарный файл
Запись string в бинарный файл C++
getline в string C++
C++ Getline и string
string И getline C++

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

Или воспользуйтесь поиском по форуму:
VLK
193 / 162 / 12
Регистрация: 05.05.2013
Сообщений: 1,225
12.08.2013, 16:22  [ТС]     getline, string, запись в файл, русский язык #15
Цитата Сообщение от alsav22 Посмотреть сообщение
Как тогда понимать это?

Дело было как, я установил Microsoft Visual Studio 2012, потом создал консольный проект, в нем был всего один файл, source.cpp и я в него записал следующий код для удобства :


Кликните здесь для просмотра всего текста
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
#include <iostream> 
 
#define rus setlocale(LC_ALL,""); 
#define pause system("pause");
 
 
 
 
 
 
int main()
{
rus;
 
 
 
 
 
 
 
 
 
 
 
 
 
pause;
return 0;
}


конечно многих знающих программистов улыбнёт этот код, но что поделать, надо с чего то начинать.

Потом я то, что получилось, сохранил как шаблон (Файл –> Экспорт шаблонов).

И теперь при создании новой программы, выбираю этот шаблон и в нем уже делаю программу.

Но каждая сделанная в нем программа имеет настройки шрифта такие, как показаны на скриншоте выше (и вообще лично я эти настройки шрифта ни где не задавал).
Yandex
Объявления
12.08.2013, 16:22     getline, string, запись в файл, русский язык
Ответ Создать тему
Опции темы

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