【问题标题】:What am I doing wrong with the input function?我在输入功能上做错了什么?
【发布时间】:2013-10-21 09:42:26
【问题描述】:

所以对于我的第二个 C++ 类,我们必须编写一个程序来创建一个由 5 个结构和一个类组成的数组。结构中是一个 int、一个 5 个双精度数组和一个 81 个元素的字符数组。当然,其中一项功能是从用户那里获取信息。该函数称为 setStructData() :

    void Prog1Class::setStructData()
{
    for(int i=0; i<5; i++)
    {
        cout<<"input an integer, five doubles, and a character array up to 80 characters."<<endl;
        cin>>StructArray[i].m_iVal;
        for(int j=0; j<5; j++)
        {
            cin>>StructArray[i].m_dArray[j];
        }
        cin.ignore('\n');
        cin>>StructArray[i].m_sLine; 
        cout<<"String entered: "<<StructArray[i].m_sLine<<endl;
    }

} 

下一个函数 getStructData() 是获取结构数组中的每个元素,然后将一行中的元素、下一行中的下一个元素等等,直到数组中的所有 5 个元素都输出给用户显示。这就是我所拥有的:

void Prog1Class::getStructData(int index, Prog1Struct *struct_ptr)
{
    struct_ptr=&StructArray[index];
    cout<<struct_ptr->m_iVal<<" ";
    for(int i=0; i<5; i++)
    {
        cout<<struct_ptr->m_dArray[i]<<" "; 
    }
    cout<<struct_ptr->m_sLine<<endl;
}

当我通过键盘输入(在一行上为 structarray 中的每个元素输入)输入时,这个程序可以工作,但是我的教授给了我们一个我们应该使用的文本文件 test.txt,它看起来像这个(字符数组在不同的行上):

10 1.2 2.3 3.4 4.5 5.6 
Test string 1
20 2.3 3.4 4.5 5.6 6.7 
Test string 2
30 3.4 4.5 5.6 6.7 7.8 
Test string 3
40 4.5 5.6 6.7 7.8 8.9 
Test string 4
50 5.6 6.7 7.8 8.9 9.1 
Test string 5

是文本文件搞砸了我的程序,因为它的字符数组位于完全不同的行上。我相信这只是我输入数据的方式,但我不知道如何修复它。有人可以帮助我吗? 当我使用 I/O 重定向来使用 test.txt 文件输入我的数据时,我让它输出回第一行(没有字符串),然后剩下的就是一堆疯狂的垃圾。请帮帮我!d

【问题讨论】:

    标签: c++ arrays input struct


    【解决方案1】:

    首先,您应该始终验证您的输入是否成功!也就是说,在读取流仍然处于良好状态后始终检查,例如:

    if (!(std::cin >> StructArray[i].m_dArray[j])) {
        std::cout << "failed to read double value\n";
    }
    

    接下来,当使用格式化输入到字符数组时,你总是首先要设置宽度!如果不设置宽度,您会在程序中创建一个可以被黑客攻击的攻击向量(这可能对您的家庭作业无关紧要,但一旦您创建了专业软件,它可能非常重要):

    if (!(std::cin >> std::setw(sizeof(StructArray[i].m_sLine)) >> StructArray[i].m_sLine)) {
        std::cout << "failed to read string\n";
    }
    

    但是请注意,格式化输入总是在第一个空白字符处停止读取。文件的输入似乎包含Test string 形式的字符串,这将导致Test 被读取,string 留在流中以供读取下一个项目。您可以使用getline() 读取所有输入,直到行尾。但是,由于所有格式化的输入操作都倾向于留下空格字符,例如数字后面的换行符,因此您可能应该在流中读取前导空格。例如,您可以使用

    if (!(std::cin >> std::ws).getline(StructArray[i].m_sLine, sizeof(StructArray[i].m_sLine)) {
        ...
    }
    

    就个人而言,我更喜欢使用std::getline(std::cin &gt;&gt; std::ws, str),第二个参数的类型为std::string,但您的分配似乎不允许使用std::string 类。 操纵器 std::ws 读取所有前导空格。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-29
      • 2013-08-10
      • 1970-01-01
      • 2023-01-26
      • 2011-05-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多