我想从用户输入创建一个数组。用户输入如下所示:
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 / Arrays的最小/最大值时,它会变得非常混乱许多不同的数组和元素。
所以现在我想做的是这样的事情:
struct Prog
{
unsigned int ID;
static const int num_elements = 6;
signed int numbers[num_elements];
};
然后我可以通过执行1 for循环并使用1 if语句比较值来更容易地找到最小/最大值,而不是像我之前的示例中那样。
我的问题是,我不知道如何采用上面的新结构并在顶部读取数据文件,并将它们存储在程序中以对它们运行操作。任何帮助将不胜感激。
感谢。
编辑:不使用std中的向量或std。
中的min / max答案 0 :(得分: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];
}
}
不确定这是否能回答您的问题,但它至少会为您提供一些信息。
答案 1 :(得分: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'。)