Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Работа с потоковыми файлами, Цткл отрабатывает лишний раз 
V
    Опции темы
DjoNIK
Дата 11.10.2007, 08:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 320
Регистрация: 28.9.2006
Где: Питер/Георгиевск

Репутация: 4
Всего: 5



Есть код, он должен открыть файл, перекодировать считанные символы по PlayFair алгаритму, и записать шифротекст в выходной файл.
Сама перекодировка реализована правильно, но при входной информации "abcdfghj" я должен получить "bcfahejg", но получаю "bcfahejgjg". То есть последняя пара символов дублируется. Почему это происходит понять, пока, не могу.

Будте так добры помогите, пожалуйста, разобраться.
Код

#include <iostream>
#include <fstream>
#include <conio.h>
#include <string.h>
#include <stdlib.h>
//---------------------------------------------------------------------------
const int SCOPE = 3;

char arr[SCOPE][SCOPE] = {
            { 'a', 'b', 'c' },
            { 'd', 'e', 'f' },
            { 'j', 'g', 'h' }
                  };


int main(int argc, char* argv[])
{
if(argc==3)
{
 std::ifstream inf(argv[1]);
 if(!inf)
 {
  std::cout<<"File "<<argv[1]<<" not found!";
  return -1;
 }

 std::ofstream outf(argv[2]);
 if(!outf)
 {
  std::cout<<"Error!";
  return -1;
 }

 while(!inf.eof())
 {
  char f_ch, s_ch;
  int f_i_coord, f_j_coord;
  int s_i_coord, s_j_coord;

  inf.get(f_ch);
  if(f_ch==inf.eof())
      return 0;
  inf.get(s_ch);
  if(s_ch==inf.eof())
      return 0;

  for(int i=0; i<SCOPE; i++)
   {
    for(int j=0; j<SCOPE; j++)
     {
      if(f_ch==arr[j][i])
      {
       f_i_coord = i;
       f_j_coord = j;
      }
      if(s_ch==arr[j][i])
      {
       s_i_coord = i;
       s_j_coord = j;
      }
     }
   }
// Начало PlayFair
  if( (f_i_coord!=s_i_coord) && (f_j_coord!=s_j_coord) )
  {
   outf.put(arr[s_j_coord][f_i_coord]);
   outf.put(arr[f_j_coord][s_i_coord]);
  }
  if(f_j_coord==s_j_coord)
  {
   s_i_coord = (++s_i_coord==SCOPE) ? 0 : s_i_coord;
   f_i_coord = (++f_i_coord==SCOPE) ? 0 : f_i_coord;
   outf.put(arr[f_j_coord][f_i_coord]);
   outf.put(arr[s_j_coord][s_i_coord]);
  }
  if(f_i_coord==s_i_coord)
  {
   f_j_coord = (++f_j_coord==SCOPE) ? 0 : f_j_coord;
   s_j_coord = (++s_j_coord==SCOPE) ? 0 : s_j_coord;
   outf.put(arr[s_j_coord+1][s_i_coord]);
   outf.put(arr[f_j_coord+1][f_i_coord]);
  }
  if( (f_i_coord==s_i_coord) && (f_j_coord==s_j_coord) )
  {
   outf.put(arr[s_j_coord][s_i_coord]);
   outf.put(arr[f_j_coord][f_i_coord]);
  }
// Конец PlayFair
 }
}
else
{
 std::cout<<"Error!!!";
 return -1;
}

return 0;
}



--------------------
- Плесни-ка мне холодного кипятку.
- Как кипяток может быть холодным?! Ты, верно, хочешь кипяченой воды?
- Какая ещё кипяченая вода? Не пудри мне мозги - налейхолодного кипятку.
(разговор петербуржца и москвича)
PM MAIL ICQ   Вверх
Anikmar
Дата 11.10.2007, 09:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 9
Всего: 59



Мне кажется там не с циклом проблемы, а с записью в выходной файл.
Переделайте этот участок кода так, чтобы на выходе просто оставались 2 символа, которые затем записать в файл. Не дублируйте запись в файл многократно - утяжеляет код и его отладку.
Код

  if( (f_i_coord!=s_i_coord) && (f_j_coord!=s_j_coord) )
  {
   outf.put(arr[s_j_coord][f_i_coord]);
   outf.put(arr[f_j_coord][s_i_coord]);
  }
  if(f_j_coord==s_j_coord)
  {
   s_i_coord = (++s_i_coord==SCOPE) ? 0 : s_i_coord;
   f_i_coord = (++f_i_coord==SCOPE) ? 0 : f_i_coord;
   outf.put(arr[f_j_coord][f_i_coord]);
   outf.put(arr[s_j_coord][s_i_coord]);
  }
  if(f_i_coord==s_i_coord)
  {
   f_j_coord = (++f_j_coord==SCOPE) ? 0 : f_j_coord;
   s_j_coord = (++s_j_coord==SCOPE) ? 0 : s_j_coord;
   outf.put(arr[s_j_coord+1][s_i_coord]);
   outf.put(arr[f_j_coord+1][f_i_coord]);
  }
  if( (f_i_coord==s_i_coord) && (f_j_coord==s_j_coord) )
  {
   outf.put(arr[s_j_coord][s_i_coord]);
   outf.put(arr[f_j_coord][f_i_coord]);


PM MAIL ICQ   Вверх
DjoNIK
Дата 11.10.2007, 09:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 320
Регистрация: 28.9.2006
Где: Питер/Георгиевск

Репутация: 4
Всего: 5



Anikmar, спасибо за совет - попробую.


--------------------
- Плесни-ка мне холодного кипятку.
- Как кипяток может быть холодным?! Ты, верно, хочешь кипяченой воды?
- Какая ещё кипяченая вода? Не пудри мне мозги - налейхолодного кипятку.
(разговор петербуржца и москвича)
PM MAIL ICQ   Вверх
Lazin
Дата 11.10.2007, 09:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 41
Всего: 154



Код

  if(f_j_coord==s_j_coord)
  {
   s_i_coord = (++s_i_coord==SCOPE) ? 0 : s_i_coord;
   f_i_coord = (++f_i_coord==SCOPE) ? 0 : f_i_coord;
   outf.put(arr[f_j_coord][f_i_coord]);
   outf.put(arr[s_j_coord][s_i_coord]);
  }
  if(f_i_coord==s_i_coord)
  {
   f_j_coord = (++f_j_coord==SCOPE) ? 0 : f_j_coord;
   s_j_coord = (++s_j_coord==SCOPE) ? 0 : s_j_coord;
   outf.put(arr[s_j_coord+1][s_i_coord]);
   outf.put(arr[f_j_coord+1][f_i_coord]);
  }
  if( (f_i_coord==s_i_coord) && (f_j_coord==s_j_coord) )
  {
   outf.put(arr[s_j_coord][s_i_coord]);
   outf.put(arr[f_j_coord][f_i_coord]);
  }

Ошибка в логике: если выполняется первое условие, то значение s_i_coord может стать равно f_i_coord, и при этом выполнится условие:
 if( (f_i_coord==s_i_coord) && (f_j_coord==s_j_coord) ) - и произойдет повторная запись в файл
PM MAIL Skype GTalk   Вверх
DjoNIK
Дата 11.10.2007, 09:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 320
Регистрация: 28.9.2006
Где: Питер/Георгиевск

Репутация: 4
Всего: 5



Спасибо!!!
Anikmar && Lazin +1


--------------------
- Плесни-ка мне холодного кипятку.
- Как кипяток может быть холодным?! Ты, верно, хочешь кипяченой воды?
- Какая ещё кипяченая вода? Не пудри мне мозги - налейхолодного кипятку.
(разговор петербуржца и москвича)
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0461 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.