输入示例:
I 67 85 49
R 4
D 4
G 65 97
/ end input.txt
所以我确定这是一个基本的编程问题,但我一直在玩代码并尝试在书中查找。但我需要一种方法来继续读数,因为理论上数字可能是无穷无尽的。现在D,G,R我可以编写它来读取D和R的一个数字以及G中的两个数字,因为它永远不会改变。
顺便说一下,我代表插入,R代表秩,D代表删除,G代表范围。这是关于BST的计划。我的大部分代码都已完成,除了主要部分和小部分内容。
我正在考虑在我的交换机中使用while()循环来完成这项专长,但我很漂亮,我必须在while循环中更改我的编码。
我得到了它,所以它完全读取了操作。
感谢您的任何建议!
代码:
inFile >> oper; //prime the while loop
while(!inFile.eof())
{
switch(oper)
{
case 'I': while(//something to stop at /n)
{
inFile >> value; //tests to see if it
outFile << value; //is working correctly
MainInsert(value);
}
break;
case 'D':
break;
case 'R':
break;
case 'G':
break;
case 'F':
break;
case 'S':
break;
default: outFile << "\n Invalid Operation!" << endl;
exit (0);
}
inFile >> oper;
}
答案 0 :(得分:3)
case 'I':
{
std::string str;
std::getline(inFile, str);
std::istringstream iss(str);
iss >> value;
while(iss)
{
outFile << value;
MainInsert(value);
iss >> value;
}
break;
}
答案 1 :(得分:0)
尽管其他人使用std::getline()
方法建议的解决方案是最好的和正确的,但我建议您对代码进行一些更改以使其正常工作。
inFile >> oper; //prime the while loop
while(!inFile.eof())
{
switch(oper)
{
case 'I': while(value != '\n')
{
inFile >> value; //tests to see if it
outFile << value; //is working correctly
MainInsert(value);
}
break;
case 'D':
break;
case 'R':
break;
case 'G':
break;
case 'F':
break;
case 'S':
break;
default: outFile << "\n Invalid Operation!" << endl;
exit (0);
}
inFile >> oper;
}
我没有编译它,但它应该以这种方式工作。
答案 2 :(得分:0)
在检查语义之前,我更倾向于尽可能多地执行解析。我会立刻读完整行,然后在可能的情况下解释它。在这个简单的场景中,它是可能的,整个解析可以从主逻辑块推开。
std::string line;
while ( getline( in, line ) )
{
// Parse the line:
std::istringstream lin( line ); // process the line
char cmd;
if ( !lin >> cmd ) throw Error; // define your own error: character missing
std::vector<int> args;
std::copy( std::istream_iterator<int>(lin), std::istream_iterator<int>(),
std::back_inserter( args ) );
// Line parsed, interpret:
switch ( cmd ) {
case 'D':
case 'R':
assert( args.size() == 1 ); // ensure there a single argument
// ...
case 'I':
for ( std::vector<int>::const_iterator it = args.begin(), end = args.end();
it != end; ++it ) {
MainInsert( *it );
}
// ...
}
}