Форум программистов, компьютерный форум CyberForum.ru

Кодирование происходит криво - C++

Восстановить пароль Регистрация
 
Vero212
0 / 0 / 0
Регистрация: 21.10.2013
Сообщений: 6
21.10.2013, 23:14     Кодирование происходит криво #1
Нужно сгенерировать ключ, с помощью этого ключа зашифровать текст из файла, записать полученный текст в новый файл, затем провести обратное действие. Не могу понять почему в ключе генерируются некоторые элементы повторно. Подскажите, пожалуйста))

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#include <iostream>
#include <fstream>
#include <stdio.h>
#include <time.h>
#include <conio.h>
#include <string.h>
#include <stdlib.h>
#include<algorithm>
 
using namespace std; //файловые потоки ввода\вывода
ifstream ft("text.txt",ios::in);
ifstream alph("alphabet.txt",ios::in);//файл с алфавитом для заполнения массивов
fstream fts("text1.txt",ios::trunc|ios::out);//файл перезаписывается
ofstream ftss("text2.txt",ios::trunc|ios::out);//файл перезаписывается
ofstream fk("key.txt",ios::trunc|ios::out);//файл перезаписывается
char a[65];
char b[65];
char c[65];
int r = 66;
void main (void)
{
srand (time(NULL));
system("cls");
for(short i=0;i<=64;i++)//заполняем массивы
{
a[i]=alph.get(); //помещаем алфавит в рабочий массив
c[i]=a[i];
b[i]=a[i]; //заполняем стацион. массив алфавитом
}
alph.close();
std::random_shuffle(a,a+65);
for(short i=0; i<=64;i++) // перемешиваем массив
{
     short m = rand()%r;
std::swap(c[i],a[m]);
fk<<c[i];
 
for (short i=m; i<=r; i++); //удаление m-го элемента
{
    a[i] = a[i+1];
r--;
}
}
fk.close();
char ch;
while (!ft.eof()) // Пока не конец файла
{
ch=ft.get(); // Чтение посимвольно из файла ft
for (short i=0;i<=64;i++)
if (ch==b[i])
fts<<a[i];
}
ft.close();
fstream fts("text1.txt",ios::in);//переопределили для чтения
while (!fts.eof()) // Пока не конец файла
{
ch=fts.get(); // Чтение посимвольно из файла fts
for (short i=0;i<=64;i++)
if (ch==a[i])
    ftss<<b[i]; 
}
fts.close();
ftss.close();
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.10.2013, 23:14     Кодирование происходит криво
Посмотрите здесь:

Потоки в винде. Работает, но криво C++
C++ криво считает сумму
C++ криво считает произведение
C++ Rand в матрице работает криво.
C++ Криво пишет даные в файл
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Stella
75 / 75 / 5
Регистрация: 26.02.2013
Сообщений: 224
21.10.2013, 23:27     Кодирование происходит криво #2
потому что в a[m] в результате операции std::swap(c[i],a[m]); может попасть элемент, который там уже был, но вылетел.
Vero212
0 / 0 / 0
Регистрация: 21.10.2013
Сообщений: 6
21.10.2013, 23:38  [ТС]     Кодирование происходит криво #3
Как это можно исправить?

Разве этот цикл не выбрасывает элемент a[m]?

C++
1
2
3
4
5
for (short i=m; i<=r; i++); //удаление m-го элемента
{
    a[i] = a[i+1];
r--;
}
FiLF
52 / 52 / 15
Регистрация: 05.09.2013
Сообщений: 1,088
23.10.2013, 02:58     Кодирование происходит криво #4
Цитата Сообщение от Vero212 Посмотреть сообщение
C++
1
for (short i=m; i<=r; i++); //удаление m-го элемента { a[i] = a[i+1]; r--; } }
C++
1
2
3
4
5
6
for (short i=m; i<=r; i++); //удаление m-го элемента
{
    a[i] = a[i+1];
}
r--;
}
И начальное значение r замените на 64, чтобы не копировать мусор в Ваш массив.

Добавлено через 6 секунд
Цитата Сообщение от Vero212 Посмотреть сообщение
C++
1
for (short i=m; i<=r; i++); //удаление m-го элемента { a[i] = a[i+1]; r--; } }
C++
1
2
3
4
5
6
for (short i=m; i<=r; i++); //удаление m-го элемента
{
    a[i] = a[i+1];
}
r--;
}
И начальное значение r замените на 64, чтобы не копировать мусор в Ваш массив.
Yandex
Объявления
23.10.2013, 02:58     Кодирование происходит криво
Ответ Создать тему
Опции темы

Текущее время: 11:12. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru