2015-09-06 6 views
1

Я занимаюсь занятиями, и я пытаюсь разрешить пользователю вводить его имя, используя пробел. Когда пользователь вводит пробел, мой вывод «мусор». Можно ли использовать функцию get.line с классом? Это то, что у меня есть.Получение мусора при использовании getline()

//Practicing classes. 

#include <iostream> 
#include <string> 

using namespace std; 


//Class decleration 
class person 
{ 
    //Access Specifier 
    public: 
     string name; //Member Vairable Decleration 
     int number;  //Member Function Decleration 
}; 

//Main function. 
int main() 
{ 
    //Object creation from class. 
    person obj; 

    //Get input Values for object Variables 
    cout<<"Enter the Name: \n"; 
    cin>>obj.name; 
    cin.getline(obj.name); 

    cout<<"Enter the number:\n"; 
    cin>>obj.number; 

    //Show the output 
    cout<< obj.name <<": " << obj.number << endl; 

    return 0; 
} 
+0

Составлено ли это? [Я получаю ошибки компилятора] (http://ideone.com/3ACpIj). – Dukeling

+0

Если у вас есть код запуска и вы хотите узнать, как его улучшить (или проверьте, насколько это лучше всего), перейдите к [Code Review.SX] (http://codereview.stackexchange.com/). Если у вас есть проблемы с кодом, добавьте его в свой пост. – Zeta

+0

Я просто запустил код, который вам нужно удалить ** cin.getline (obj.name) **, после этого код будет работать – Lamar

ответ

2

Изменить это:

cin>>obj.name; 
cin.getline(obj.name); 

к:

std::getline (std::cin, obj.name); 

, как указано в manual. Вы можете опустить std::, так как вы уже используете пространство имен std.

Пример запуска:

Enter the Name: 
samaras 
Enter the number: 
1 
samaras: 1 

Однако обратите внимание, что данные члены одного класса, как правило, находятся на частной сферы и общественные функции могут применяться к ним. Кроме того, как сказал Томас Мэтьюз: «Это нарушает правила скрытия данных и инкапсуляции. Я настоятельно рекомендую, чтобы функции для чтения члена данных были помещены в класс».

Возможно, вы захотите ознакомиться с оператором перегрузки >>. Однако, если вы чувствуете, что не понимаете классы, я бы предложил оставить это на потом.

+0

@Palermox Но этот код будет читать всю строку (имя и номер). Вам придется проанализировать строку, чтобы получить номер –

+0

Удивительный, я получил его. Спасибо за помощь. :) – Palermox

+0

Добро пожаловать @Palermox. Если хотите, примите ответ, чтобы вопрос появился как разрешенный. – gsamaras

0

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

#include <iostream> 
#include <string> 

using namespace std; 
class person 
{ 
    //Access Specifier 
    public: 
    string firstname; 
    string lastname; //Member Vairable Decleration 
    int number;  //Member Function Decleration 
}; 

string returnCompleteName(string firstname, string lastname) 
    { 
    return firstname + " " + lastname; 
    } 

//Main function. 
int main() 
{ 
//Object creation from class. 
person obj; 

//Get input Values for object Variables 
cout<<"Enter the FirstName: \n"; 
cin>>obj.firstname; 

cout<<"Enter the LastName: \n"; 
cin>>obj.lastname; 

cout<<"Enter`enter code here` the number:\n"; 
cin>>obj.number; 

//Show the output 
cout<< returnCompleteName(obj.firstname,obj.lastname) <<": " << obj.number << endl; 

return 0; 
} 
0

Я также имел ту же самую проблему, используя заданные ответы, потому что я не понимаю, мой файл был закодирован в UCS-2. Это помогло: How to read a UCS-2 file?

Широкие потоки используют широкий буфер потока для доступа к файлу. Буфер потока Wide считывает байты из файла и использует его грань codecvt для , преобразуя эти байты в широкие символы. Факт по умолчанию codecvt равен std :: codecvt, который преобразует собственные наборы символов для wchar_t и char (т. Е. Как mbstowcs() ).

Вы не используете родной набор символов символов, так что вы хотите, это codecvt фаска, который читает UCS-2 в виде последовательности многобайтной и преобразует его в широкие символы.

#include <fstream> 
#include <string> 
#include <codecvt> 
#include <iostream> 

int main(int argc, char *argv[]) 
{ 
    wifstream fin("en.rc", std::ios::binary); // You need to open the file in binary mode 

    // Imbue the file stream with a codecvt facet that uses UTF-16 as the external multibyte encoding 
    fin.imbue(std::locale(fin.getloc(), 
       new std::codecvt_utf16<wchar_t, 0xffff, consume_header>)); 

    //^We set 0xFFFF as the maxcode because that's the largest that will fit in a single wchar_t 
    // We use consume_header to detect and use the UTF-16 'BOM' 

    // The following is not really the correct way to write Unicode output, but it's easy 
    std::wstring sLine; 
    std::wstring_convert<std::codecvt_utf8<wchar_t>, wchar_t> convert; 
    while (getline(fin, sLine)) 
    { 
     std::cout << convert.to_bytes(sLine) << '\n'; 
    } 
} 
+0

Включите соответствующую информацию из ссылки, чтобы ответить на вопрос о stackoverflow, потому что ссылки могут стать недействительными. – sebenalern

Смежные вопросы