使用getline时获取垃圾()

时间:2015-09-06 16:46:55

标签: c++ io getline

我正在练习课程,我正在尝试允许用户使用空格输入其名称。当用户输入空格时,我的输出是"垃圾"。是否可以将get.line函数与类一起使用?这就是我所拥有的。

IShellFolder

4 个答案:

答案 0 :(得分:2)

改变这个:

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

为:

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

manual指定。您可以省略std::,因为您已经在使用命名空间标准。

示例运行:

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

但请注意,类的数据成员通常位于私有范围,公共函数可以应用于它们。此外,正如Thomas Matthews所说:“这打破了数据隐藏和封装规则。我强烈建议将读取数据成员的功能放在类中。”

您可能希望查看重载运算符>>。但是,如果您觉得自己没有完成对课程的理解,我建议将其留待以后使用。

答案 1 :(得分: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;
}

答案 2 :(得分:0)

我使用指定的答案也遇到了同样的问题,因为我没有意识到我的文件是用UCS-2编码的。这有助于:How to read a UCS-2 file?

  

宽流使用宽流缓冲区来访问文件。广泛的   stream buffer从文件中读取字节并使用其codecvt facet   将这些字节转换为宽字符。默认的codecvt方面是   std :: codecvt在。之间进行转换   wchar_t和char的本机字符集(即,像mbstowcs()   一样)。

     

你没有使用本机字符集,所以你想要的是一个   codecvt facet将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';
    }
}

答案 3 :(得分:0)

使用十六进制编辑器打开您正在阅读的文件,并检查在可见数据之前是否有一些字节。最后我删除了这些字节,用 20 个十六进制数据覆盖它们,这意味着空间,然后用编辑器清理文件。