Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.86/96: Рейтинг темы: голосов - 96, средняя оценка - 4.86
198 / 170 / 19
Регистрация: 05.05.2013
Сообщений: 1,235
1

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

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

Author24 — интернет-сервис помощи студентам
Кликните здесь для просмотра всего текста
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 на русском языке?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
12.08.2013, 15:27
Ответы с готовыми решениями:

Xcode , С++ и русский язык: как вывести в файл русский текст без сбитой кодировки?
Как сделать так, чтобы после некоторых манипуляций в файл выводился русский текст без сбитой...

String и русский язык
Доброго времени суток! Мой вопрос скорее всего задавался, но всё же как с клавиатуры ввести в...

Русский язык и тип string
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;string&gt; using namespace std; int main...

Как в string использовать русский язык?
как в string использовать русский язык, setlocale не помогает ...

20
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
12.08.2013, 15:31 2
Цитата Сообщение от VLK Посмотреть сообщение
ввожу сумму, потом когда предлагает ввести имя, программа сам ввод пропускает,
Везде, где есть cin >>, используйте такое:
C++
1
(cin >> sum).get();
1
198 / 170 / 19
Регистрация: 05.05.2013
Сообщений: 1,235
12.08.2013, 15:39  [ТС] 3
Я не совсем понял (и явно не я в этом виноват), т.е. из-за строчки 25 ( cin >> sum ) у меня строчка 27 ( std::getline(cin, name) ) не работает?
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
12.08.2013, 15:40 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) ) не работает?
Да.
1
70 / 70 / 13
Регистрация: 13.05.2012
Сообщений: 130
12.08.2013, 15:42 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;
}
1
198 / 170 / 19
Регистрация: 05.05.2013
Сообщений: 1,235
12.08.2013, 15:46  [ТС] 6
А по поводу русского языка?
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
12.08.2013, 15:47 7
Цитата Сообщение от Valentina Посмотреть сообщение
setlocale (LC_ALL, ".1251"); // для ввода;
Это разве на ввод работает?
0
198 / 170 / 19
Регистрация: 05.05.2013
Сообщений: 1,235
12.08.2013, 15:47  [ТС] 8
Цитата Сообщение от alsav22 Посмотреть сообщение
Это разве на ввод работает?
В файл записывает каракули
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
12.08.2013, 15:48 9
Цитата Сообщение от VLK Посмотреть сообщение
А по поводу русского языка?
C++
1
2
3
4
5
6
7
8
#include <windows.h>
 
int main()
{
  SetConsoleCP(1251);
  SetConsoleOutputCP(1251);
  ...
}
В свойствах консоли выбрать шрифт: Lucida Console
2
198 / 170 / 19
Регистрация: 05.05.2013
Сообщений: 1,235
12.08.2013, 16:00  [ТС] 10
Самый короткий (и простой) путь для записи в файл русскими буквами это:

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

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

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

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

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


как переделать?
0
198 / 170 / 19
Регистрация: 05.05.2013
Сообщений: 1,235
12.08.2013, 16:10  [ТС] 13
Цитата Сообщение от alsav22 Посмотреть сообщение
Недостаточно просто? Есть более сложные...
Я поинтересовался, мало ли..
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
12.08.2013, 16:14 14
Цитата Сообщение от VLK Посмотреть сообщение
честно сказать я сейчас впервые переключил шрифт на указанный, до этого с подобным не сталкивался, не было потребности.
Как тогда понимать это?
Цитата Сообщение от VLK Посмотреть сообщение
И еще как я заметил, приходится при создании каждой программы (консольной) приходится в ручную устанавливать шрифт: Lucida Console,
Как вы могли это заметить, если шрифт не устанавливали?

Добавлено через 59 секунд
Цитата Сообщение от VLK Посмотреть сообщение
как переделать?
Один раз установите и будет стоять.
0
198 / 170 / 19
Регистрация: 05.05.2013
Сообщений: 1,235
12.08.2013, 16:22  [ТС] 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;
}


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

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

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

Но каждая сделанная в нем программа имеет настройки шрифта такие, как показаны на скриншоте выше (и вообще лично я эти настройки шрифта ни где не задавал).
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
12.08.2013, 16:25 16
Цитата Сообщение от VLK Посмотреть сообщение
и вообще лично я эти настройки шрифта ни где не задавал).
Ну так задайте нужные. Эти настройки - это настройки консоли, а не среды, проектов, шаблонов и пр.
0
198 / 170 / 19
Регистрация: 05.05.2013
Сообщений: 1,235
12.08.2013, 16:32  [ТС] 17
Цитата Сообщение от alsav22 Посмотреть сообщение
Ну так задайте нужные. Эти настройки - это настройки консоли, а не среды, проектов, шаблонов и пр.
Пуск –> Выполнить –> cmd
я там установил шрифт: Lucida Console

Но все равно при создании новых приложений через Microsoft Visual Studio 2012 у меня настройки такие же как на скриншоте выше.
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
12.08.2013, 16:36 18
Попробуйте установить, когда запущен код из студии.
0
198 / 170 / 19
Регистрация: 05.05.2013
Сообщений: 1,235
12.08.2013, 16:40  [ТС] 19
Уже сделал, но результат такой же

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

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


Цитата Сообщение от alsav22 Посмотреть сообщение
Попробуйте установить, когда запущен код из студии.
а нельзя разве прописать в скобках у main() параметры, в частности что бы этот шрифт устанавливался Lucida Console.
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
12.08.2013, 16:48 20
У меня такой проблемы нет, настроил один раз и всё. Если у вас не сохраняются настройки консоли, то создайте отдельную тему, может кто подскажет, в чём тут дело.
1
12.08.2013, 16:48
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.08.2013, 16:48
Помогаю со студенческими работами здесь

При преобразовании string в LPCWSTR не выдает русский язык
Выдает все кроме русского языка. Грешу на кодировку, скорее всего не правильно преобразуется string...

Перевести файл на русский язык
программа сделана через шелл, но под английскую винду. Никак не могу ее нормально перевести....

запись string в файл в определенном формате (из Unicode в ASCII. Файл записывать умею)
Здравствуйте. Можете помочь? Записать файл я умею. Но не понимаю как перевести из кодировки...

Считывание из файла построчно и запись в файл построчно getline ()
# include &lt;iostream&gt; # include &lt;vector&gt; # include &lt;fstream&gt; # include &lt;string&gt; using...


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

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