【问题标题】:How to read a structure variable wholesale from keyboard which contains a c-string, an int and a float?如何从包含 c-string、int 和 float 的键盘批发读取结构变量?
【发布时间】:2013-05-06 17:30:50
【问题描述】:
#include <iostream>
#include <cmath>
#include <cstdlib>
#include <climits>
#include <cfloat>
#include <cstring>
#include <string>
using namespace std;

struct news
{
    char a[10];
    int n;
    float r;
};

int main()
{
    news k;
    cin >> k;
    cout << k.a << endl;
    cout << k.n << endl;
    cout << k.r << endl;
    return 0;
}

它给了我一个全屏的错误。有人知道如何解决这个问题吗?谢谢!

test.cc:在函数“int main()”中: test.cc:20: 错误: 'std::cin >> k' 中的'operator>>' 不匹配 /usr/include/c++/4.2.1/istream:131:注意:候选者是:std::basic_istream<_chart _traits>& std::basic_istream<_chart _traits>::operator>>(std::basic_istream& (*)(std::basic_istream<_chart _traits>&)) [with _CharT = char, _Traits = std::char_traits] /usr/include/c++/4.2.1/istream:135: 注意:std::basic_istream<_chart _traits>& std::basic_istream<_chart _traits>::operator>>(std::basic_ios<_chart _traits>& (*)(std::basic_ios<_chart _traits>&)) [with _CharT = char, _Traits = std::char_traits] /usr/include/c++/4.2.1/istream:142: 注意:std::basic_istream<_chart _traits>& std::basic_istream<_chart _traits>::operator>>(std::ios_base& (*)( std::ios_base&)) [with _CharT = char, _Traits = std::char_traits] /usr/include/c++/4.2.1/istream:178: 注意:std::basic_istream<_chart _traits>& std::basic_istream<_chart _traits>::operator>>(bool&) [with _CharT = char, _Traits = std::char_traits] /usr/include/c++/4.2.1/istream:182: 注意:std::basic_istream<_chart _traits>& std::basic_istream<_chart _traits>::operator>>(short int&) [with _CharT = char , _Traits = std::char_traits] /usr/include/c++/4.2.1/istream:185: 注意:std::basic_istream<_chart _traits>& std::basic_istream<_chart _traits>::operator>>(short unsigned int&) [with _CharT =字符,_Traits = std::char_traits] /usr/include/c++/4.2.1/istream:189: 注意:std::basic_istream<_chart _traits>& std::basic_istream<_chart _traits>::operator>>(int&) [with _CharT = char, _Traits = std::char_traits] /usr/include/c++/4.2.1/istream:192: 注意:std::basic_istream<_chart _traits>& std::basic_istream<_chart _traits>::operator>>(unsigned int&) [with _CharT = char , _Traits = std::char_traits] /usr/include/c++/4.2.1/istream:196: 注意:std::basic_istream<_chart _traits>& std::basic_istream<_chart _traits>::operator>>(long int&) [with _CharT = char , _Traits = std::char_traits] /usr/include/c++/4.2.1/istream:200: 注意:std::basic_istream<_chart _traits>& std::basic_istream<_chart _traits>::operator>>(long unsigned int&) [with _CharT =字符,_Traits = std::char_traits] /usr/include/c++/4.2.1/istream:205: 注意:std::basic_istream<_chart _traits>& std::basic_istream<_chart _traits>::operator>>(long long int&) [with _CharT =字符,_Traits = std::char_traits] /usr/include/c++/4.2.1/istream:209: 注意:std::basic_istream<_chart _traits>& std::basic_istream<_chart _traits>::operator>>(long long unsigned int&) [with _CharT = 字符,_Traits = std::char_traits] /usr/include/c++/4.2.1/istream:214: 注意:std::basic_istream<_chart _traits>& std::basic_istream<_chart _traits>::operator>>(float&) [with _CharT = char, _Traits = std::char_traits] /usr/include/c++/4.2.1/istream:218: 注意:std::basic_istream<_chart _traits>& std::basic_istream<_chart _traits>::operator>>(double&) [with _CharT = char, _Traits = std::char_traits] /usr/include/c++/4.2.1/istream:222: 注意:std::basic_istream<_chart _traits>& std::basic_istream<_chart _traits>::operator>>(long double&) [with _CharT = char , _Traits = std::char_traits] /usr/include/c++/4.2.1/istream:226: 注意:std::basic_istream<_chart _traits>& std::basic_istream<_chart _traits>::operator>>(void*&) [with _CharT =字符,_Traits = std::char_traits] /usr/include/c++/4.2.1/istream:250: 注意:std::basic_istream<_chart _traits>& std::basic_istream<_chart _traits>::operator>>(std::basic_streambuf<_chart _traits>*) [with _CharT = char, _Traits = std::char_traits]

【问题讨论】:

    标签: c++ structure output


    【解决方案1】:

    创建friend函数重载:

    friend std::istream& operator >>(std::istream& is, news const& n)
    {
        return in >> n.a >> n.n >> n.r;
    }
    

    您的程序如下所示:

    #include <iostream>
    
    struct news
    {
        char a[10];
        int n;
        float r;
    
        friend std::istream& operator >>(std::istream& is, news& n)
        {
            return is >> n.a >> n.n >> n.r;
        }
    };
    
    int main()
    {
        news k;
    
        std::cin >> k;
        std::cout << k.a << std::endl;
        std::cout << k.n << std::endl;
        std::cout << k.r << std::endl;
    }
    

    Live Demo

    【讨论】:

    • 而且...您的方法是 OOP 的一部分吗?我只是一个 C++ 初学者,还没有开始接触 OOP。
    • @user1050165 从技术上讲,这是因为istream 是一个对象,我们正在使用它拥有的方法(如operator &gt;&gt;)
    • 你测试过你的程序吗?它像以前一样提供全屏错误。
    • @user1050165 我这里有一个工作程序 -- ideone.com/CH8zUa#view_edit_box
    • @user1050165 没问题 :)
    【解决方案2】:

    这不会自动发生,因为std::cin 不知道您希望输入如何格式化或输入应如何分配给news 对象的成员。您必须单独阅读其每个成员:

    cin >> k.a >> k.n >> k.r;
    

    您也可以为执行类似这样的操作的news 提供operator&gt;&gt; 重载。例如:

    istream& operator>>(istream& in, news& cPoint)
    {
      in >> k.a >> k.n >> k.r;
      return in;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-13
      • 1970-01-01
      • 2016-08-11
      • 1970-01-01
      • 2018-05-17
      相关资源
      最近更新 更多