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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 39, средняя оценка - 4.90
VLK
 Аватар для VLK
192 / 161 / 12
Регистрация: 05.05.2013
Сообщений: 1,221
12.08.2013, 15:27     getline, string, запись в файл, русский язык #1
Кликните здесь для просмотра всего текста
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 на русском языке?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.08.2013, 15:27     getline, string, запись в файл, русский язык
Посмотрите здесь:

Запись string в файл C++
запись в файл string C++
Запись string в файл C++
Русский язык и тип string C++
String и русский язык C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
12.08.2013, 15:31     getline, string, запись в файл, русский язык #2
Цитата Сообщение от VLK Посмотреть сообщение
ввожу сумму, потом когда предлагает ввести имя, программа сам ввод пропускает,
Везде, где есть cin >>, используйте такое:
C++
1
(cin >> sum).get();
VLK
 Аватар для VLK
192 / 161 / 12
Регистрация: 05.05.2013
Сообщений: 1,221
12.08.2013, 15:39  [ТС]     getline, string, запись в файл, русский язык #3
Я не совсем понял (и явно не я в этом виноват), т.е. из-за строчки 25 ( cin >> sum ) у меня строчка 27 ( std::getline(cin, name) ) не работает?
alsav22
5282 / 4801 / 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
66 / 66 / 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
 Аватар для VLK
192 / 161 / 12
Регистрация: 05.05.2013
Сообщений: 1,221
12.08.2013, 15:46  [ТС]     getline, string, запись в файл, русский язык #6
А по поводу русского языка?
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
12.08.2013, 15:47     getline, string, запись в файл, русский язык #7
Цитата Сообщение от Valentina Посмотреть сообщение
setlocale (LC_ALL, ".1251"); // для ввода;
Это разве на ввод работает?
VLK
 Аватар для VLK
192 / 161 / 12
Регистрация: 05.05.2013
Сообщений: 1,221
12.08.2013, 15:47  [ТС]     getline, string, запись в файл, русский язык #8
Цитата Сообщение от alsav22 Посмотреть сообщение
Это разве на ввод работает?
В файл записывает каракули
alsav22
5282 / 4801 / 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
 Аватар для VLK
192 / 161 / 12
Регистрация: 05.05.2013
Сообщений: 1,221
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
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
12.08.2013, 16:06     getline, string, запись в файл, русский язык #11
Цитата Сообщение от VLK Посмотреть сообщение
И еще как я заметил, приходится при создании каждой программы (консольной) приходится в ручную устанавливать шрифт: Lucida Console,
Почему вам приходится, а, например, мне нет? ОС какая?

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

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

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

Добавлено через 59 секунд
Цитата Сообщение от VLK Посмотреть сообщение
как переделать?
Один раз установите и будет стоять.
VLK
 Аватар для VLK
192 / 161 / 12
Регистрация: 05.05.2013
Сообщений: 1,221
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;
}


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

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

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

Но каждая сделанная в нем программа имеет настройки шрифта такие, как показаны на скриншоте выше (и вообще лично я эти настройки шрифта ни где не задавал).
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
12.08.2013, 16:25     getline, string, запись в файл, русский язык #16
Цитата Сообщение от VLK Посмотреть сообщение
и вообще лично я эти настройки шрифта ни где не задавал).
Ну так задайте нужные. Эти настройки - это настройки консоли, а не среды, проектов, шаблонов и пр.
VLK
 Аватар для VLK
192 / 161 / 12
Регистрация: 05.05.2013
Сообщений: 1,221
12.08.2013, 16:32  [ТС]     getline, string, запись в файл, русский язык #17
Цитата Сообщение от alsav22 Посмотреть сообщение
Ну так задайте нужные. Эти настройки - это настройки консоли, а не среды, проектов, шаблонов и пр.
Пуск –> Выполнить –> cmd
я там установил шрифт: Lucida Console

Но все равно при создании новых приложений через Microsoft Visual Studio 2012 у меня настройки такие же как на скриншоте выше.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
12.08.2013, 16:36     getline, string, запись в файл, русский язык #18
Попробуйте установить, когда запущен код из студии.
VLK
 Аватар для VLK
192 / 161 / 12
Регистрация: 05.05.2013
Сообщений: 1,221
12.08.2013, 16:40  [ТС]     getline, string, запись в файл, русский язык #19
Уже сделал, но результат такой же

Я создал абсолютно новый проект, новый файл, новый код "шаблон", запустил, установил шрифт: Lucida Console, потом сохранил как шаблон для Microsoft Visual Studio 2012, сейчас создал программу, вот что в настройках:

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

Цитата Сообщение от alsav22 Посмотреть сообщение
Попробуйте установить, когда запущен код из студии.
а нельзя разве прописать в скобках у main() параметры, в частности что бы этот шрифт устанавливался Lucida Console.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.08.2013, 16:48     getline, string, запись в файл, русский язык
Еще ссылки по теме:

C++ Запись string в бинарный файл
C++ Как в string использовать русский язык?
Запись string в бинарный файл C++

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

Или воспользуйтесь поиском по форуму:
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
12.08.2013, 16:48     getline, string, запись в файл, русский язык #20
У меня такой проблемы нет, настроил один раз и всё. Если у вас не сохраняются настройки консоли, то создайте отдельную тему, может кто подскажет, в чём тут дело.
Yandex
Объявления
12.08.2013, 16:48     getline, string, запись в файл, русский язык
Ответ Создать тему
Опции темы

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