Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Программа пропускает внутренний цикл


Автор: Ober 26.8.2011, 19:47
Добрый вечер, объясните пожалуйста,  почему при выполнении внешнего цикла while несколько раз, внутренний  цикл while выполняется не больше одного раза, а в остальных случаях просто пропускается. Вроде и указатель ставлю на начало файла, и поток очищаю а он все равно не выполняется. Предположим, что transaction.txt, base.txt, new.txt уже созданы и в первых двух файлах больше чем по 2 записи.

Код

void sop()
{
  int abase; //номер акаунта в конечном файле
  char b[ 10 ]; //имя в конечном файле
  double cbase; //баланс в конечном файле
     
  int atrans; //номер аккаунта в первичном файле
  double ctrans; //значение транзакции в первичном файле
  double sum; //сумма баланса после транзакции 
     
  fstream transactionFileIn( "transaction.txt", ios::in | ios::out );
  fstream baseFileIn( "base.txt", ios::in | ios::out );
  fstream newFileOut ( "new.txt", ios::out | ios::out );

  
  transactionFileIn >> atrans >> ctrans; //считываем данные из первичного файла 
  while( !transactionFileIn.eof() )//пока не конец файла
  {  
    cout << "trans cicle\n";    

      cin.clear();   
      baseFileIn.seekg( 0 );  

      baseFileIn >> abase >> b >> cbase;
    while( !baseFileIn.eof() )//пока не конец базового файла
    {          
      cout << "Base Cicle\n";         
      if( atrans != abase  )
      { 
        cout << "Not evalue\n";  
        newFileOut << abase << " " << b << " " << cbase << endl;
      }//конец if    

      //если номер счета в первичном файле равен номеру счета в конечном       
      else if( atrans == abase )
       {    
         cout << "Evalue\n";   
         sum = cbase + ctrans;   
         newFileOut << abase << " " << b << " " << sum << endl;
       }//конец else  

       baseFileIn >> abase >> b >> cbase;   
    }//конец внутреннего while

     cout << "End out\n";   
     transactionFileIn >> atrans >> ctrans; //считываем данные из первичного файла   
}//конец внешнего while    
} 
         
За ранее спасибо.

Автор: Estranged 26.8.2011, 23:48
Сразу после baseFileIn.seekg( 0 ); написать streamoff offset = baseFileIn.tellg (); чисто ради шутки.

Автор: Ober 27.8.2011, 00:01
Цитата(Estranged @ 26.8.2011,  23:48)
Сразу после baseFileIn.seekg( 0 ); написать streamoff offset = baseFileIn.tellg (); чисто ради шутки.

Честно говоря шутки не понял ))

Автор: Estranged 27.8.2011, 16:56
Так узнаем текущую позицию чтения в файле base.txt.
baseFileIn.seekg( 0 );  
streamoff offset = baseFileIn.tellg ();
baseFileIn >> abase >> b >> cbase;

Кроме того, до цикла, который не выполняется, читаются данные. Вдруг уже конец файла?

baseFileIn.seekg( 0 );  
streamoff offset = baseFileIn.tellg (); <- здесь ожидаем 0
baseFileIn >> abase >> b >> cbase;
streamoff offset2 = baseFileIn.tellg (); <- здесь что? Конца файла не достигли случайно?
while( !baseFileIn.eof() )//пока не конец базового файла
...

Автор: vinick 27.8.2011, 18:01
В строке 21 вы очищаете не тот поток. это опечатка на форуме или в коде так же? Если второе, то замените на baseFileIn.clear()

Автор: Ober 27.8.2011, 19:25
Цитата(vinick @ 27.8.2011,  18:01)
В строке 21 вы очищаете не тот поток. это опечатка на форуме или в коде так же? Если второе, то замените на baseFileIn.clear()

Большое спасибо вам за помощь, это была моя ошибка, я очищал не тот поток и поэтому в BaseFileIn оставался признак конца файла.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)