Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.05.2009, 21:23   #11
FastDead2
Пользователь
 
Аватар для FastDead2
 
Регистрация: 09.05.2009
Сообщений: 12
По умолчанию

2:Sazary
На самом деле длинна одинаково определилась)) и так и так можно)

Я вот в конце программы сразу и дешифрацую провёл, дешифровала правильно, значит проблема не в длинне. Скорее всего не корректно записывается ключ и зашифрованный текст в файл, точнее сказать не полностью. Помогите пажалуста) В чём может быть дело?
FastDead2 вне форума Ответить с цитированием
Старый 09.05.2009, 21:46   #12
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Цитата:
На самом деле длинна одинаково определилась)) и так и так можно)
Это потому, что буфера в 900 с лишним символов хватило. Если бы текст был длиннее, то длина ключа была бы меньше.

Что обнаружил: везде пишете
Код:
  for(i = 0; i<=len; i++)
а надо
Код:
  for(i = 0; i<len; i++)
И в конце не освобождаете память!
Допишите:
Код:
delete[] oStr;
delete[] key;
delete[] shStr;
Далее. Скажите, что работает не так и как оно должно работать правильно.
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 09.05.2009, 22:10   #13
FastDead2
Пользователь
 
Аватар для FastDead2
 
Регистрация: 09.05.2009
Сообщений: 12
По умолчанию

Мне кажется проблема в записи ключа в файл, я вот сделал, таким образом:
Код:
scanf("%d",&m);
FILE *y;
	printf("Please, enter a name of a file for a key: ");
	scanf("%s",naz);
	int num;
    if ((y=fopen(naz,"w"))==NULL)
    {printf(" Owibka otkritija fajla!!!");
    getch();}
	else
	{
		num=fwrite(key, sizeof(char), m, y);
	}
	fclose(y);
Я так понимаю в функции fwrite, m - это размер файла?
FastDead2 вне форума Ответить с цитированием
Старый 09.05.2009, 22:17   #14
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Цитата:
Я так понимаю в функции fwrite, m - это размер файла?
Первый аргумент - буфер, из которого берутся данные.
2 - размер единицы данных (в данном случае 1 байт)
3 - размер буфера. То есть количество единиц данных.
4 - указатель на файл.

Цитата:
Мне кажется проблема в записи ключа в файл
Вы можете сказать, в чем конкретно проблема? А то я как-то не очень понимаю.
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 09.05.2009, 22:42   #15
FastDead2
Пользователь
 
Аватар для FastDead2
 
Регистрация: 09.05.2009
Сообщений: 12
По умолчанию

Вообще у меня две программы, они похожи одна шифрует(1) другая дешифрует(2).
И я понять не могу, то ли в 1 не правильно ключ, и зашифрованное сообщение записываются в файл.
Или во второй не правильно читаются ключ, и шифр. Потому что в результате дешифровки, исходное сообщение не получается.

Шифрование
Код:


int _tmain(int argc, _TCHAR* argv[])
{ int i,len,n,m; //Определяем необходимые переменные
  char naz[20]; 
  char nazv[20]; 

  printf("Please use English letters!!!\n");
  printf("\nVtikai razmer: \n");
  scanf("%d",&m);
// текст из файла для шифрования
printf("\nThe initial text: \n");
FILE *x;
size_t k;
char ooStr[999];

x = fopen("qw.txt","r");
len = 0;
while(!feof(x))
 {
  k = fread(ooStr,sizeof(char),m,x);
  ooStr[k]=0;
  len += k;
  printf("%s",ooStr);
 }
fclose(x);

   //len = strlen(ooStr);// определяем длину строки открытого текста
   printf("\n%d\n", len);
   char *oStr = new char[len]; //объявляем динамический массив указанной длины для открытого текста
   char *key = new char[len];  //точно такой же массив объявляем для ключа
   char *shStr = new char[len];  //массив-приемник для зашифрованного текста
   for(i=0;i<len;i++)
   oStr[i]=ooStr[i];
    printf("\n\n"); 

// определяем ключ случайным образом
   printf("\nKey:  \n");
   for(i=0; i<len; i++)
   key[i]=(char)rand()%255;
   printf("%s", key);
   printf("\n\n");
// записываем ключ в файл
   	FILE *y;
	printf("Please, enter a name of a file for a key: ");
	scanf("%s",naz);
	int num;
    if ((y=fopen(naz,"w"))==NULL)
    {printf(" Owibka otkritija fajla!!!");
    getch();}
	else
	{
		num=fwrite(key, sizeof(char), m, y);
	}
	fclose(y); 
	printf("The file is written down...\n");

//собственно само шифрование
   for(i = 0; i<len; i++)
      shStr[i]=oStr[i]^key[i];

//для наглядности выведем на экран результат работы
    printf("\nThe ciphered text: %s", shStr);

// записываем зашифрованный текст в файл 
    FILE *t;
	printf("\n\nPlease, enter a name of a file for the ciphered text: ");
	scanf("%s",nazv);
	int num2;
    if ((t=fopen(nazv,"w"))==NULL)
    {printf(" Owibka otkritija fajla!!!");
    getch();}
	else
	{
	num2=fwrite(shStr, sizeof(char), m, t);
	}
	fclose(t); 
	printf("The file is written down...\n");
	printf("\nPress any key...");


    _getch();
	return 0;

Дешифрование

Код:

int _tmain(int argc, _TCHAR* argv[])
{ int i,len,m; 
  char naz[20]; 
  char nazv[20]; 
  char shhStr[944];

  printf("Please use English letters!!!\n");
  printf("\nVtikai razmer: \n");
  scanf("%d",&m);
  // текст из файла для дешифрования 
  FILE *x;
size_t k;

x = fopen("zash.txt","r");
len = 0;
while(!feof(x))
 {
  k = fread(shhStr,sizeof(char),m,x);
  shhStr[k]=0;
    len += k;
  printf("%s",shhStr);
 }
fclose(x);
    

   char *oStr = new char[len]; 
   char *key = new char[len]; 
   char *shStr = new char[len]; 

   for(i=0;i<=len;i++)
   shStr[i]=shhStr[i];
   printf("\nThe ciphered text: %s", shStr);
    printf("\n\n");

   printf("\nKey: \n");
// читаем ключ из файла
  FILE *y;
size_t h;

y = fopen("kl.txt","r");

while(!feof(y))
 {
  h = fread(key,sizeof(char),m,y);
  key[h]=0;
  printf("%s",key);
 }
fclose(y);
     printf("\n");
//собственно само дешифрование
   for(i = 0; i<=len; i++)
      oStr[i]=shStr[i]^key[i];

//для наглядности выведем на экран результат работы
    printf("\nThe initial text: %s", oStr);

// записываем расшифрованный текст в файл 
    FILE *t;
	printf("\n\nPlease, enter a name of a file for the initial text: ");
	scanf("%s",nazv);
	int num3;
    if ((t=fopen(nazv,"w"))==NULL)
    {printf(" Owibka otkritija fajla!!!");
    getch();}
	else
	{
		num3=fwrite(oStr, sizeof(char), m, t);
	}
	fclose(t); 
	printf("The file is written down...\n");
	printf("\nPress any key...");
    _getch();
	return 0;

}
Понимаю букв многа, но если осилите и посмотрите буду очень благодарен
FastDead2 вне форума Ответить с цитированием
Старый 09.05.2009, 23:15   #16
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Цитата:
Понимаю букв многа, но если осилите и посмотрите буду очень благодарен
Так сразу все равно сложно разобраться ) Тем более уже вечер..

Итак. Во-первых, в программе дешифровки исправьте циклы (i от 0 до len не включая).
Теперь о ключе в программе шифрования. Проблема найдена.
Вы генерируете значение:
Код:
 key[i]=(char)rand()%255;
от 0 до 254. От нуля!
То есть на какой-то символ выпадет ноль! И программа думает, что это конец строки.
Исправьте так:
Код:
key[i]=(char)(rand()%255+1);
И добавьте освобождение памяти. Иначе будет утечка.

------------
Давайте следующий вопрос )
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 09.05.2009, 23:53   #17
FastDead2
Пользователь
 
Аватар для FastDead2
 
Регистрация: 09.05.2009
Сообщений: 12
По умолчанию

Цитата:
Сообщение от Sazary Посмотреть сообщение
Теперь о ключе в программе шифрования. Проблема найдена.
Вы генерируете значение:
Код:
 key[i]=(char)rand()%255;
от 0 до 254. От нуля!
То есть на какой-то символ выпадет ноль! И программа думает, что это конец строки.
Здесь вы очень точно подметили, это помогло, вроде ключ стал полностью записываться.
Но вот дешифрование идёт частично, пару слов дешифрует, а остальное нет.

циклы везде подправил, и память тоже освободил)
FastDead2 вне форума Ответить с цитированием
Старый 10.05.2009, 00:41   #18
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Подправил еще некоторые недочеты. Но пока работает некорректно.
шифровалка
Код:
#include <stdio.h>
#include <string.h>
#include <conio.h>
#include <stdlib.h>
#include <iostream>
using namespace std;

int main()
{ int i,len,n,m; //Определяем необходимые переменные
  char naz[20]; 
  char nazv[20]; 

  printf("Please use English letters!!!\n");
  printf("\nVtikai razmer: \n");
  scanf("%d",&m);
// текст из файла для шифрования
printf("\nThe initial text: \n");
FILE *x;
size_t k;
char ooStr[999];

x = fopen("input.txt","r");
len = 0;
while(!feof(x))
 {
  k = fread(ooStr,sizeof(char),m,x);
  ooStr[k]=0;
  len += k;
  printf("%s",ooStr);
 }
fclose(x);

   //len = strlen(ooStr);// определяем длину строки открытого текста
   printf("\n%d\n", len);
   char *oStr = new char[len]; //объявляем динамический массив указанной длины для открытого текста
   char *key = new char[len];  //точно такой же массив объявляем для ключа
   char *shStr = new char[len];  //массив-приемник для зашифрованного текста
   for(i=0;i<len;i++)
   oStr[i]=ooStr[i];
    printf("\n\n"); 

// определяем ключ случайным образом
   printf("\nKey:  \n");
   for(i=0; i<len; i++)
   key[i]=(char)(rand()%254+1);
   printf("%s", key);
   printf("len = \n%d\n%d\n",len,strlen(key));
   printf("\n\n");
// записываем ключ в файл
   	FILE *y;
	printf("Please, enter a name of a file for a key: ");
	scanf("%s",naz);
	int num;
    if ((y=fopen(naz,"w"))==NULL)
    {printf(" Owibka otkritija fajla!!!");
    getch();}
	else
	{
		num=fwrite(key, sizeof(char), m, y);
	}
	fclose(y); 
	printf("The file is written down...\n");

//собственно само шифрование
   for(i = 0; i<len; i++)
      shStr[i]=oStr[i]^key[i];

//для наглядности выведем на экран результат работы
    printf("\nThe ciphered text: %s", shStr);

// записываем зашифрованный текст в файл 
    FILE *t;
	printf("\n\nPlease, enter a name of a file for the ciphered text: ");
	scanf("%s",nazv);
	int num2;
    if ((t=fopen(nazv,"w"))==NULL)
    {printf(" Owibka otkritija fajla!!!");
    getch();}
	else
	{
	num2=fwrite(shStr, sizeof(char), m, t);
	}
	fclose(t); 
	printf("The file is written down...\n");
	printf("\nPress any key...");
delete[] oStr; //объявляем динамический массив указанной длины для открытого текста
delete[] key;  //точно такой же массив объявляем для ключа
delete[] shStr; 

    _getch();
	return 0;
}
дешифр
Код:
#include <stdio.h>
#include <string.h>
#include <conio.h>
#include <stdlib.h>
#include <iostream>
using namespace std;

int main()
{ int i,len,m; 
  char naz[20]; 
  char nazv[20]; 
  char shhStr[944];

  printf("Please use English letters!!!\n");
  printf("\nVtikai razmer: \n");
  scanf("%d",&m);
  // текст из файла для дешифрования 
  FILE *x;
size_t k;

x = fopen("output.txt","r");
len = 0;
while(!feof(x))
 {
  k = fread(shhStr,sizeof(char),m,x);
  shhStr[k]=0;
  len += k;
  printf("%s",shhStr);
 }
fclose(x);
    

   char *oStr = new char[len]; 
   char *key = new char[len]; 
   char *shStr = new char[len]; 

   for(i=0;i<len;i++)
    shStr[i]=shhStr[i];
   printf("\nThe ciphered text: %s", shStr);
    printf("\n\n");

   printf("\nKey: \n");
// читаем ключ из файла
  FILE *y;
size_t h;

y = fopen("key.txt","r");

while(!feof(y))
 {
  h = fread(key,sizeof(char),len,y);
  key[h]=0;
  printf("%s",key);
 }
fclose(y);
     printf("\n");
//собственно само дешифрование
   for(i = 0; i<len; i++)
      oStr[i]=shStr[i]^key[i];

//для наглядности выведем на экран результат работы
    printf("\nThe initial text: %s", oStr);

// записываем расшифрованный текст в файл 
    FILE *t;
	printf("\n\nPlease, enter a name of a file for the initial text: ");
	scanf("%s",nazv);
	int num3;
    if ((t=fopen(nazv,"w"))==NULL)
    {printf(" Owibka otkritija fajla!!!");
    getch();}
	else
	{
		num3=fwrite(oStr, sizeof(char), len, t);
	}
	fclose(t); 
	printf("The file is written down...\n");
	printf("\nPress any key...");
delete[] oStr;
delete[] key;
delete[] shStr; 
	
    _getch();
	return 0;

}
Новые придирки:
Вы используете переменную m при записи блоков, а надо len.

В самом начале нужно просто пройтись по файлу и выяснить его размер, а потом уже выделять память.
Вы же сразу определяете некий максимум.
Код:
char ooStr[999];
Собственно, в выходном файле появилось нечто осмысленное.
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 13.05.2009, 20:36   #19
FastDead2
Пользователь
 
Аватар для FastDead2
 
Регистрация: 09.05.2009
Сообщений: 12
По умолчанию

Вот теперь программа дешифрует вроде нормально, только первую букву не печатает, место неё пробел или символ какой-нибудь почему так?

Код:
#include "stdafx.h"
#include <stdio.h>
#include <string.h>
#include <conio.h>
#include <stdlib.h>
#include <iostream>
using namespace std;


int _tmain(int argc, _TCHAR* argv[])
{ int i,len,m; 
  char naz[20]; 
  char nazv[20]; 
  char shhStr[999];

  printf("Please use English letters!!!\n");
  printf("\nVtikai razmer: \n");
  scanf("%d",&m);
  // текст из файла для дешифрования 
  FILE *x;
size_t k;

x = fopen("zash.txt","r");
len = 0;
while(!feof(x))
 {
  k = fread(shhStr,sizeof(char),m+1,x);
  shhStr[k]=0;
    len += k;
 }
fclose(x);
    
  // len = strlen(shhStr);// определяем длину строки зашифрованного текста
   char *oStr = new char[len+1]; //объявляем динамический массив указанной длины для открытого текста
   char *key = new char[len+1];  //точно такой же массив объявляем для ключа
   char *shStr = new char[len+1];  //массив-приемник для зашифрованного текста
   for(i=0;i<len;i++)
   shStr[i]=shhStr[i];
    shStr[len]='\0';
   printf("\nThe ciphered text: %s", shStr);
    printf("\n\n");

   printf("\nKey: \n");
// читаем ключ из файла
  FILE *y;
size_t h;

y = fopen("kl.txt","r");

while(!feof(y))
 {
  h = fread(key,sizeof(char),m+1,y);
  key[h]=0;
  printf("%s",key);
  key[len]='\0';
 }
fclose(y);
     printf("\n");
//собственно само дешифрование
   for(i = 0; i<len; i++)
      oStr[i]=shStr[i]^key[i];
      oStr[len]='\0';
//для наглядности выведем на экран результат работы
    printf("\nThe initial text: %s", oStr);

// записываем расшифрованный текст в файл 
    FILE *t;
	printf("\n\nPlease, enter a name of a file for the initial text: ");
	scanf("%s",nazv);
	int num3;
    if ((t=fopen(nazv,"w"))==NULL)
    {printf(" Owibka otkritija fajla!!!");
    getch();}
	else
	{
		num3=fwrite(oStr, sizeof(char), m+1, t);
	}
	fclose(t); 
	printf("The file is written down...\n");
	printf("\nPress any key...");
   
delete[] oStr;
delete[] key;
delete[] shStr;
	_getch();
	return 0;

}
FastDead2 вне форума Ответить с цитированием
Старый 13.05.2009, 23:01   #20
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

FastDead2
Приведите еще листинг шифратора, а то у меня бред при дешифровке получается (может, вы просто что-нибудь еще там исправили).

И еще. Поясните, что за файлы "zash.txt" и "kl.txt". Как я понимаю, эти имена нужно указывать при шифровании (соответственно, выходной файл и ключ)?

И скажите, какой размер буфера вы вводите в начале программы.
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Чтение>сортировка>запись theFEAR Помощь студентам 1 22.04.2009 09:33
Запись/чтение из файла (С++) alexov Общие вопросы C/C++ 15 18.01.2009 17:35
Запись в файл и чтение из него. Swool Общие вопросы C/C++ 8 26.08.2008 16:39
Запись и чтение файла... Altera Общие вопросы Delphi 5 06.05.2008 20:22