读取一行数字并在行结束后停止

时间:2010-11-01 06:03:51

标签: c++

输入示例:

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;
}

3 个答案:

答案 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 );
      }
   // ...      
   }
}