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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 5.00
seruy-t
2 / 2 / 0
Регистрация: 21.08.2010
Сообщений: 216
#1

0D 0A FF В конце файла после шифрования - C++

06.06.2013, 19:42. Просмотров 1551. Ответов 20
Метки нет (Все метки)

Всем привет. Пишу прогу для шифрования по алгоритму Цезаря. Знаю-знаю, целая туча таких Написал 2 для шифрования и расшифровывания одной буквы. При обработке строк и выводе их на экран проблем вроде бы нет, но когда дело доходит до файлов ... При зашифровании в конце файлов появляются лишние символи 0D 0A FF. А при расшифровывании символи 1А .
Знаю, что 0D 0A это переход на новую строку.
Выяснил, что 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
char find_and_encr_char(char what_find,int key){
      char engl_abet[26]= {'q','w','e','r','t','y','u','i','o','p','a','s','d','f','g','h','j','k','l','z','x','c','v','b','n','m'};
    bool founded= false; // знайдено ?
 
      char encr_char;
      if(what_find==' ') {
          encr_char=' ';
          founded=true;
          return encr_char;
                             }
    if(what_find=='.') {
          encr_char='.';
          founded=true;
          return encr_char;
                             }
 
      for(int i=0;i<26;i++){
 
                int abskey=i+key; 
                            if(engl_abet[i]==what_find){
                                if((i+key)>26){ abskey=(i+key)%26 ; }
                                encr_char=engl_abet[abskey];
                                founded=true;
                                break;
                                                       }
                            }
 
if(founded==false) encr_char=what_find;
                              return encr_char; }
 
char find_and_decr_char(char what_find, int key)
{
 char engl_abet[26]= {'q','w','e','r','t','y','u','i','o','p','a','s','d','f','g','h','j','k','l','z','x','c','v','b','n','m'};
 
  if(what_find == ' ')         return ' ';
    if(what_find == '.')         return '.';
 
   for(int i=0;i<26;i++)
   {
      if (what_find == engl_abet[i]){
         if ((i-key) < 0)         return engl_abet[(26 - (-1*(i - key)%26))%26];
         else            return engl_abet[i-key];
   }
   }
}
P.S. Просьба не отсылать на топики с другими реализациями этого алгоритма, я там был хочу доделать именно так так задумал изначально
Миниатюры
0D 0A FF В конце файла после шифрования   0D 0A FF В конце файла после шифрования  
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.06.2013, 19:42     0D 0A FF В конце файла после шифрования
Посмотрите здесь:

Как считать информацию из файла, если в конце стоит пробел? C++
C++ Удалить ненужную информацию в конце файла, не создавая другой файл
C++ Вставить после каждого слова в предложении запятую, а в конце предложения стоит точка
"4102" в конце файла при записи C++
Написать программы шифрования и расшифровки файла методом циклического сдвига C++
C++ Алгоритм шифрования из exe файла
Не понятный дополнительный символ в конце файла C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alsav22
5415 / 4811 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
06.06.2013, 19:50     0D 0A FF В конце файла после шифрования #2
Цитата Сообщение от seruy-t Посмотреть сообщение
но когда дело доходит до файлов
Если дело в файлах, то покажите как пишите в файл, как читаете из файла.
seruy-t
2 / 2 / 0
Регистрация: 21.08.2010
Сообщений: 216
06.06.2013, 19:54  [ТС]     0D 0A FF В конце файла после шифрования #3
alsav22,
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
string write_and_encrypt_file(string filename, string content,int key)
{
 
 FILE *file_for_write=fopen(filename.c_str(),"w");
 //cout<<"\n filestream started\n";
 
    if(file_for_write==NULL) return "Something wrong, error of writing file !";
    bool result= fputs(((encr_string(content,key)).c_str()),file_for_write);
fclose(file_for_write);
            if(!result) {
                       return "true";
                        }
            else return "false";
 
}
 
 
bool write_and_decrypt_file(string filename, string in,int key)
    {
 FILE *file_for_write=fopen(filename.c_str(),"wt");
 if(file_for_write==NULL) return false;
 bool flag=false;
   for(unsigned int i=0;i<in.length();i++){
    if(!fputc((find_and_decr_char(in[i],key)),file_for_write)) flag=true;
    else flag=false;
                                   }
    fclose(file_for_write);
     if(flag==false) return false;
     else return true;
     }
alsav22
5415 / 4811 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
06.06.2013, 20:11     0D 0A FF В конце файла после шифрования #4
string content как создаётся перед передачей на запись в файл?
seruy-t
2 / 2 / 0
Регистрация: 21.08.2010
Сообщений: 216
06.06.2013, 20:20  [ТС]     0D 0A FF В конце файла после шифрования #5
alsav22,
read_file(patch)
C++
1
 if((write_and_encrypt_file(output_file,read_file(patch),key))=="true") cout <<"DONE \n";
C++
1
2
3
4
5
6
7
8
9
10
11
12
string read_file(string filename){
    string input_of_file_for_reading="";
    FILE *input_file = fopen(filename.c_str(),"rt");
        if(input_file==NULL)    return "File invalid";
        while(!feof(input_file)){
                input_of_file_for_reading+=fgetc(input_file);
                                }
 
            fclose(input_file);
            return input_of_file_for_reading;
 
                                  }
alsav22
5415 / 4811 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
06.06.2013, 20:24     0D 0A FF В конце файла после шифрования #6
Это не ответ на вопрос. Показывайте read_file().
seruy-t
2 / 2 / 0
Регистрация: 21.08.2010
Сообщений: 216
06.06.2013, 20:28  [ТС]     0D 0A FF В конце файла после шифрования #7
alsav22,
C++
1
2
3
4
5
6
7
8
9
10
11
12
string read_file(string filename){
    string input_of_file_for_reading="";
    FILE *input_file = fopen(filename.c_str(),"rt");
        if(input_file==NULL)    return "File invalid";
        while(!feof(input_file)){
                input_of_file_for_reading+=fgetc(input_file);
                                }
 
            fclose(input_file);
            return input_of_file_for_reading;
 
                                  }
alsav22
5415 / 4811 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
06.06.2013, 20:34     0D 0A FF В конце файла после шифрования #8
В файле, который читает read_file() одна строка?
seruy-t
2 / 2 / 0
Регистрация: 21.08.2010
Сообщений: 216
06.06.2013, 20:38  [ТС]     0D 0A FF В конце файла после шифрования #9
alsav22, Нет
Вложения
Тип файла: txt new_sh.txt (227 байт, 6 просмотров)
alsav22
5415 / 4811 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
06.06.2013, 21:39     0D 0A FF В конце файла после шифрования #10
Цитата Сообщение от seruy-t Посмотреть сообщение
Нет
В файле одна (и в конце - символ новой строки). Если бы была не одна, то 0D 0A были бы не только в конце. При шифровании, у вас как обрабатывается символ новой строки?
seruy-t
2 / 2 / 0
Регистрация: 21.08.2010
Сообщений: 216
06.06.2013, 22:01  [ТС]     0D 0A FF В конце файла после шифрования #11
alsav22, Никак, все символы, что не входят в английский алфавит должны "дописываться" в конечный текст как уже зашифрованные
C++
1
2
if(founded==false) encr_char=what_find;
                              return encr_char;
Заметил, что, при выводе на экран расшифрованного текста появляются стрелки (1А) вместо "!"

Добавлено через 13 минут
Исходя с этого

Enter text for encryption
!@#$%^&*()_
Enter key
112

AFTER ENCRYTION : !@#$%^&*()_
и этого

Enter the text for decryption:
!@#$%^&*()_

Enter the key
112
AFTER DECRYPTION:→→→→→→→→→→→
→ (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
char find_and_decr_char(char what_find, int key)
{
 char engl_abet[26]= {'q','w','e','r','t','y','u','i','o','p','a','s','d','f','g','h','j','k','l','z','x','c','v','b','n','m'};
 
  if(what_find == ' ')         return ' ';
    if(what_find == '.')         return '.';
 
   for(int i=0;i<26;i++)
   {
      if (what_find == engl_abet[i]){
         if ((i-key) < 0)         return engl_abet[(26 - (-1*(i - key)%26))%26];
         else            return engl_abet[i-key];
   }
   }
}
 
string decr_string(string in, int key){
string out="";
 
for(unsigned int i=0;i<in.length();i++){
    out+=find_and_decr_char(in[i],key);
}
 
 
 return out;}
alsav22
5415 / 4811 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
06.06.2013, 22:21     0D 0A FF В конце файла после шифрования #12
Цитата Сообщение от seruy-t Посмотреть сообщение
все символы, что не входят в английский алфавит должны "дописываться" в конечный текст как уже зашифрованные
Значит, в принципе, символ новой строки вам не должне мешать? Измените чтение из файла вот так (чтобы символ конца файла не попадал в строку), может этого окажется достаточно:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
string read_file(string filename){
    string input_of_file_for_reading="";
    FILE *input_file = fopen(filename.c_str(),"rt");
        if(input_file==NULL)    return "File invalid";
        
        while(true)
        {
         char ch = fgetc(input_file);
         if (ch == EOF) break;
         input_of_file_for_reading += ch;
         }
 
            fclose(input_file);
            return input_of_file_for_reading;
 
}
В крайнем случае, от FF в конце зашифрованного файла избавитесь.

Добавлено через 13 минут
Цитата Сообщение от seruy-t Посмотреть сообщение
проблема здесь
У вас в find_and_decr_char() возврата нет, если нет захода в if/else.
seruy-t
2 / 2 / 0
Регистрация: 21.08.2010
Сообщений: 216
06.06.2013, 22:26  [ТС]     0D 0A FF В конце файла после шифрования #13
alsav22,
Сделал как Вы посоветовали, таки да, этого было достаточно. Сделал еще такой костить в функции расшифровки

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
 char find_and_decr_char(char what_find, int key)
{
 char engl_abet[26]= {'q','w','e','r','t','y','u','i','o','p','a','s','d','f','g','h','j','k','l','z','x','c','v','b','n','m'};
 
  if(what_find == ' ')         return ' ';
    if(what_find == '.')         return '.';
        if(what_find == '1')         return '1';
            if(what_find == '2')         return '2';
                if(what_find == '3')         return '3';
                    if(what_find == '4')         return '4';
                        if(what_find == '5')         return '5';
                            if(what_find == '6')         return '6';
                                if(what_find == '7')         return '7';
                                    if(what_find == '8')         return '8';
                                        if(what_find == '9')         return '9';
                                            if(what_find == '0')         return '0';
    if(what_find == '!')         return '!';
        if(what_find == '@')         return '@';
            if(what_find == '$')         return '$';
                if(what_find == '%')         return '%';
                    if(what_find == '&')         return '&';
                        if(what_find == '*')         return '*';
                            if(what_find == '(')         return '(';
                                if(what_find == '_')         return '_';
                                    if(what_find == ')')         return ')';
                                        if(what_find == '?')         return '?';
   for(int i=0;i<26;i++)
   {
      if (what_find == engl_abet[i]){
         if ((i-key) < 0)         return engl_abet[(26 - (-1*(i - key)%26))%26];
         else            return engl_abet[i-key];
   }
   }
}
И еще одно
Enter path and name of file for decryption
C:\e.txt
Do you want to display it ?(yes/no)
yes
[C:\e.txt (227 symbols) ]

---------Begin of file---------------------

tzalu.xhq zb v lbgh blccxhjgn ixsslazjk fgpbzjg fwxbg szbbzxa zb jx chxsxjg tzal
u jwhxlqw gnlivjzxa. jwg ixajgaj xm jwzb fgpbzjg zb ngbzqagn jx pg zajghvijgn fz
jw pk jwg tzalu ixsslazjk. fg txxr mxhfvhn jx kxlh cvhjzizcvjzxa!
--------------END of file------------------

Enter the path for saving
C:\d.txt
Enter the key
12
FAIL, error of recording
Хотя файл записывает нормально
alsav22
5415 / 4811 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
06.06.2013, 22:34     0D 0A FF В конце файла после шифрования #14
Цитата Сообщение от seruy-t Посмотреть сообщение
Сделал еще такой костить в функции расшифровки
Наверное, это можно проще сделать. Надо подумать как. Возврат символа без расшифровки, если его нет в массиве. Т.е. сделать возврат, которого у вас нет, а должен быть в любом случае.
seruy-t
2 / 2 / 0
Регистрация: 21.08.2010
Сообщений: 216
06.06.2013, 22:37  [ТС]     0D 0A FF В конце файла после шифрования #15
Цитата Сообщение от alsav22 Посмотреть сообщение
Возврат символа без расшифровки, если его нет в массиве.
тоже об этом подумывал. А что на счет этого ?
Цитата Сообщение от seruy-t Посмотреть сообщение
Enter path and name of file for decryption
C:\e.txt
Do you want to display it ?(yes/no)
yes
[C:\e.txt (227 symbols) ]
---------Begin of file---------------------
tzalu.xhq zb v lbgh blccxhjgn ixsslazjk fgpbzjg fwxbg szbbzxa zb jx chxsxjg tzal
u jwhxlqw gnlivjzxa. jwg ixajgaj xm jwzb fgpbzjg zb ngbzqagn jx pg zajghvijgn fz
jw pk jwg tzalu ixsslazjk. fg txxr mxhfvhn jx kxlh cvhjzizcvjzxa!
--------------END of file------------------
Enter the path for saving
C:\d.txt
Enter the key
12
FAIL, error of recording
Хотя файл записывает нормально
C++
1
2
if((write_and_decrypt_file(output_file,read_file(patch),key))) cout <<"DONE \n";
else cout<<"FAIL, error of recording";
alsav22
5415 / 4811 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
06.06.2013, 22:38     0D 0A FF В конце файла после шифрования #16
Может как-то так?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
char find_and_decr_char(char what_find, int key)
{
    char engl_abet[26] = {'q','w','e','r','t','y','u','i','o','p','a','s','d','f','g','h','j','k','l','z','x','c','v','b','n','m'};
 
    //if(what_find == ' ')         return ' ';
    //if(what_find == '.')         return '.';
 
   for(int i = 0; i < 26; i++)
   {
         if (what_find == engl_abet[i])
         {
            if ((i - key) < 0) return engl_abet[(26 - (-1*(i - key)%26))%26];
            else  return engl_abet[i - key];
        }
   }
   return what_find;
}
Kuzia domovenok
1889 / 1744 / 117
Регистрация: 25.03.2012
Сообщений: 5,917
Записей в блоге: 1
06.06.2013, 22:39     0D 0A FF В конце файла после шифрования #17
0D 0A это символы CR LF
перевод строки, возврат печатной каретки.
alsav22
5415 / 4811 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
06.06.2013, 22:40     0D 0A FF В конце файла после шифрования #18
Цитата Сообщение от seruy-t Посмотреть сообщение
А что на счет этого ?
Разобраться нужно. У меня же кода нет перед глазами. Там кусок, здесь кусок. Приходится туда-сюда лазить.
seruy-t
2 / 2 / 0
Регистрация: 21.08.2010
Сообщений: 216
06.06.2013, 22:47  [ТС]     0D 0A FF В конце файла после шифрования #19
alsav22,
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
char find_and_decr_char(char what_find, int key)
{
 char engl_abet[26]= {'q','w','e','r','t','y','u','i','o','p','a','s','d','f','g','h','j','k','l','z','x','c','v','b','n','m'};
 
  if(what_find == ' ')         return ' ';
    if(what_find == '.')         return '.';
        if(what_find == '1')         return '1';
            if(what_find == '2')         return '2';
                if(what_find == '3')         return '3';
                    if(what_find == '4')         return '4';
                        if(what_find == '5')         return '5';
                            if(what_find == '6')         return '6';
                                if(what_find == '7')         return '7';
                                    if(what_find == '8')         return '8';
                                        if(what_find == '9')         return '9';
                                            if(what_find == '0')         return '0';
    if(what_find == '!')         return '!';
        if(what_find == '@')         return '@';
            if(what_find == '$')         return '$';
                if(what_find == '%')         return '%';
                    if(what_find == '&')         return '&';
                        if(what_find == '*')         return '*';
                            if(what_find == '(')         return '(';
                                if(what_find == '_')         return '_';
                                    if(what_find == ')')         return ')';
                                        if(what_find == '?')         return '?';
   for(int i=0;i<26;i++)
   {
      if (what_find == engl_abet[i]){
         if ((i-key) < 0)         return engl_abet[(26 - (-1*(i - key)%26))%26];
         else            return engl_abet[i-key];
   }
   }
}

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
string read_file(string filename){
    string input_of_file_for_reading="";
    FILE *input_file = fopen(filename.c_str(),"rt");
        if(input_file==NULL)    return "File invalid";
 
        while(true)
        {
         char ch = fgetc(input_file);
         if (ch == EOF) break;
         input_of_file_for_reading += ch;
         }
 
            fclose(input_file);
            return input_of_file_for_reading;
 
}

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
bool write_and_decrypt_file(string filename, string in,int key)
    {
 FILE *file_for_write=fopen(filename.c_str(),"wt");
 if(file_for_write==NULL) return false;
 bool flag=false;
   for(unsigned int i=0;i<in.length();i++){
    if(!fputc((find_and_decr_char(in[i],key)),file_for_write)) flag=true;
    else flag=false;
                                   }
    fclose(file_for_write);
     if(flag==false) return false;
     else return true;
     }
C++
1
2
3
4
5
6
7
8
9
10
11
12
 cout<<"\nEnter the path for saving\n";
                   string output_file;
                   cin>>output_file;
                   cout<<"\nEnter the key\n";
                   int key;
                   cin>>key;
                        if(key<0) {
                                cout<<"Very funny ...";
                                  return 1;
                                  }
                    if((write_and_decrypt_file(output_file,read_file(patch),key))) cout <<"DONE \n";
                    else cout<<"FAIL, error of recording";
Добавлено через 2 минуты
Kuzia domovenok, Это я еще в шапке написал, но спасибо за внимание
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.06.2013, 22:52     0D 0A FF В конце файла после шифрования
Еще ссылки по теме:

Результат после вывода из файла C++
C++ Написать AES, шифрования любого файла .exe.
Как обрезать N байт в конце файла не перезаписывая его? C++
C++ Переписать все строки файла F.txt в файл G.txt, удаляя все пробелы в конце каждой строки
Ошибка C1075 в конце файла обнаружен левый непарный фигурная скобка C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
alsav22
5415 / 4811 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
06.06.2013, 22:52     0D 0A FF В конце файла после шифрования #20
Вот это:
C++
1
2
3
4
5
...
for(unsigned int i=0;i<in.length();i++){
    if(!fputc((find_and_decr_char(in[i],key)),file_for_write)) flag=true;
    else flag=false;
...
fputc() что возвращает при правильном считывании?
Yandex
Объявления
06.06.2013, 22:52     0D 0A FF В конце файла после шифрования
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru