-1

我想从用户输入创建一个数组。用户输入将如下所示:

ID     Numbers
1 -3 2 -1 12 19 8
2  3 1 -3 2 19 5
3  7 4 1 7 9 3
4  9 12 4 6 -7 4

所以有一个ID,然后是6个数字。我最多可以有 20 个 ID。起初我有类似的东西

struct Prog 
{
    unsigned int ID;
    signed int num_1;
    signed int num_2;
    signed int num_3;
    signed int num_4;
    signed int num_5;
    signed int num_6;
};

我使用以下命令在终端的单独函数中读取数据文件作为输入:

for (;;)
{
cin >> Temp.ID >> Temp.num_1 >> Temp.num_2 >> Temp.num_3 >> Temp.num_4 >> Temp.num_5 >> Temp.num_6;
}

然而,问题是,当我试图找到这些 ID/数组的最小/最大值时,它变得非常混乱,因为有那么多不同的数组和元素。

所以现在我想做的是这样的:

struct Prog 
{
    unsigned int ID;
    static const int num_elements = 6;
    signed int numbers[num_elements];

};

然后稍后我可以通过执行 1 for 循环并使用 1 if 语句而不是之前的示例中的许多值来比较值,从而更容易找到最小/最大值。

我的问题是,我不确定如何获取上述新结构并读取顶部给定的数据文件并将它们存储在程序中以对其运行操作。任何帮助,将不胜感激。

谢谢。

编辑:不使用来自 std 的向量或来自 std 的 min/max。

4

2 回答 2

1

这是你想要的?


for (;;)
{
cin >> Temp.ID >> Temp.numbers[0] >> Temp.numbers[1] >> Temp.numbers[2] >> Temp.numbers[3] >> Temp.numbers[4] >> Temp.numbers[5];
}

也许


while(1)
{
  cin >> Temp.ID;

  for(int i = 0; i<Temp.num_elements; i++)
  {
    cin >> Temp.number[i];
  } 
}

不确定这是否回答了您的问题,但它至少为您提供了一些信息。

于 2013-02-21T16:14:15.740 回答
1

首先,如果元素的数量可以改变,最简单的解决方案是使用std::vector

struct Prog
{
    int id;
    std::vector<int> num;
};

其次,读取对象的常用方法是使用>>. 但是,在这种情况下,您没有真正的分隔符,因此任何 operator>>人都不知道在哪里停止。下一个最佳解决方案是拥有一个接受字符串的构造函数,并依靠您的客户端知道如何分隔输入。就像是:

Prog::Prog( std::string const& toParse )
{
    std::istringstream parser( toParse );
    parser >> id;
    if ( ! parser ) {
        throw std::runtime_error( "no id" );
    }
    int element;
    while ( parser >> element ) {
        num.push_back( element );
    }
    if ( ! parser.eof() ) {
        //  Format error, before running out of data
        throw std::runtime_error( "format error" );
    }
}

由于这是一个构造函数,因此报告错误的唯一方法是异常。(它可能应该是explicit。)

最后,由于您可能想要创建多个,并且您的实际输入是面向行的:

std::string line;
int lineNumber = 0;
while ( std::getline( input, line ) ) {
    ++ lineNumber;
    try {
        data.push_back( Prog( line ) );
    } catch ( std::runtime_error const& error ) {
        std::cerr << error.what() << " (line " << lineNumber << ")\n";
    }
}

因为你也不知道这里有多少,data 应该是一个std::vector<Prog>. (即使您确实知道预期有多少,我也会使用 `std::vector'。)

于 2013-02-21T16:36:28.297 回答