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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 5.00
Coler
0 / 0 / 0
Регистрация: 01.10.2009
Сообщений: 6
#1

Проблема при считывании из файла - C++

06.11.2010, 22:28. Просмотров 1387. Ответов 14
Метки нет (Все метки)

Пишу простенькую программу по криптографии. В результате шифрования получается txt файлик с набором закорючек(он во вложении). Для дешифрования надо файл обратно считать, а он считывает первые 72 символа нормально, а дальше нули одни. Причем до этого обычный текст нормально считывал тем же методом
считывал так
C++
1
2
3
    static char*str;
    ifstream Datamas ("Encrypted.txt");
    Datamas.read(str,size);
пробовал также так
C++
1
2
3
4
5
6
7
    static char*str;
    ifstream Datamas ("Encrypted.txt");
    while (pos<size)
    {           
        Datamas1.get(data1[pos]);
        pos++;
    }
начал тестить для других текстов и выявил странную закономерность: перестает считывать после определенного символа. а именно "". Может кто-нибудь подскажет как решить эту проблему?

Encrypted.rar
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.11.2010, 22:28
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Проблема при считывании из файла (C++):

Переполнение при считывании из файла - C++
Подскажите пожалуйста, где ошибка, вот код чтения из файла: void read_file(void) { int mass; FILE* file = fopen(&quot;arr.txt&quot;, &quot;r&quot;); ...

Лишние символы при считывании файла - C++
Считываю структуру с файла и вывожу в консоль, при выводе появляются лишние символы в конце. Скажите пожалуйста с чем это связано и как их...

Ошибка при считывании двоичного файла - C++
При считывании из .EXE файла возникает ошибка, а возникает она когда считываемый байт равен 0x1A. Если он есть в файле то программа &quot;видит&quot;...

Разъясните ошибки при считывании файла - C++
не пойму что от меня требуется тут) пол года изучаем язык) часть ошибок исправил но при считывании с файла лепит нарушение прав доступа ...

Неверная кодировка при считывании из файла - C++
Проблема такая, при считывание из файла идет кракозябра, как это исправитьsetlocale(LC_ALL, &quot;rus&quot;); FILE *fp; if(!(fp =...

Лишние биты при считывании файла - C++
Нужно порциями по 63 байта считать текст из файла. &quot;in&quot; - мой открытый файл для чтения. Вот отрывок из кода fseek(in, 0, SEEK_END); ...

14
Coler
0 / 0 / 0
Регистрация: 01.10.2009
Сообщений: 6
07.11.2010, 21:01  [ТС] #2
нашел как избавиться от проблемы, правда суть так и не понял. На вашем же форуме была уже такая тема Считывание данных из файла
з.ы. через гугл искал - но тот как символ этот видел, сразу кучу каркозяблей выдавал. А яндекс норм нашел
0
accept
4823 / 3244 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
08.11.2010, 01:17 #3
C++
1
static char *str;
а что это, указатель, который указывает никуда ?
0
Coler
0 / 0 / 0
Регистрация: 01.10.2009
Сообщений: 6
08.11.2010, 22:45  [ТС] #4
там дальше в программе он инициализируется...это я зря строчку в этот листинг засунул...
0
RUSya82
236 / 114 / 3
Регистрация: 15.10.2010
Сообщений: 395
08.11.2010, 22:56 #5
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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
/*Программа шифрует/дешифрует любой файл по заданному паролю.
Тестировалась на .avi, .doc, .txt, mp3.
Выполнил .*/
#include <iostream>
#include <conio.h>
#include <fstream>
#include <cstring>
#include <stdio.h>
 
using namespace std;
/*------key1 - ключ. пароль///filename1[30] - имя файла на входе
filename2[30] - имя файла на выходе///k1 - длина ключа
coding1,2,3 - переменные для преобразования исходного символа*/
int main()
{
    FILE *fp1, *fp2, *fp3, *fp4;//объявляем потоки
    char filename1[30], filename2[30],key1[20];
    int n=0,m=0,k1;
    unsigned char code=0;
    int temp;
    int coding1, coding2, coding3, coding4, z;
    cout << "1 - Зашифровать файл.\n" << "2 - расшифровать файл\n";
    cin >> z;
    if(z==1)
    {
       cout << "Введите пароль для шифрования: ";
       cin >> key1;
       cout << "key = " << key1;
       cout << "\nВведите имя файла для шифрования: ";
       cin >> filename1;
       k1 = strlen(key1);//обработка ключа
       cout << "k1 = " << k1 << endl;
       for(int i=0;i<k1;i++)
       {
            code = (code + key1[i]);
       } 
       // m - вычисляется из ключа сложением по модулю 2^6
       for(int i=1;i<k1;i++)
       {
            m = (key1[i-1] + key1[i])%64;
       }
       cout << "m = " << m << endl;
       /*отрывает входной файл только для 
       чтения в бинарном режиме*/
       fp1 = fopen(filename1, "rb");
       if (!fp1)
       {
          cout << "Ошибка открытия файла\n";
          getch();
          exit(1);
       }
       cout << "\nВведите имя зашифрованного файла: ";
       cin >> filename2;
       /*открываем новый файл для записи
       в бинарном режиме*/
       fp2 = fopen(filename2, "wb");
       if (!fp2)
       {
          cout << "Ошибка открытия файла\n";
          getch();
          exit(1);
       }
       for(int i = 0;i<16;i++)
        {
       while((temp = getc(fp1)) != EOF)
       {
          //инвертируем биты
          coding1 = ~temp;
          //Исключающее ИЛИ
          coding2 = coding1^code;
          //Сложение
          coding3 = coding2 + code;
          //Исключающее ИЛИ с m
          coding4 = coding3^m;
 
          putc(coding4,fp2);
       };
       }
       fclose(fp1);
       fclose(fp2);
    }
    else
    {
        cout << "Введите пароль для расшифровки: ";
        cin >> key1;
        cout << "\nkey = " << key1;
        k1 = strlen(key1);
        cout << "\nk1 = " << k1 << endl;
        for(int i=0;i<k1;i++)
        {
            code = (code + key1[i]);
        } 
        for(int i=1;i<k1;i++)
        {
            m = (key1[i-1] + key1[i])%64;
        }
        cout << "m = " << m << endl;
        cout << "\nВведите имя файла для расшифрования: ";
        cin >> filename1;
        fp3 = fopen(filename1, "rb");
        if (!fp3)
        {
        cout << "Ошибка открытия файла\n";
        getch();
        exit(1);
        }
        cout << "\nВведите имя рашифрованного файла: ";
        cin >> filename2;
        fp4 = fopen(filename2, "wb");
        if (!fp4)
        {
           cout << "Ошибка открытия файла\n";
           getch();
           exit(1);
        }
        /*Запускаем цикл шифрования 16 раз*/
        for(int i = 0;i<16;i++)
        {
           while((temp = getc(fp3)) != EOF)
           {
               coding1 = temp^m;
               coding2 = coding1 - code;
               coding3 = coding2^code;
               coding4 = ~coding3;
               putc(coding4,fp4);
           };
        }
        fclose(fp3);
        fclose(fp4);
    }
    cout << "END\n";
    getch();
    return 0;
}
1
KuKu
1558 / 1036 / 78
Регистрация: 17.04.2009
Сообщений: 2,987
08.11.2010, 23:22 #6
Есть подозрение, что вы шифруете так, что какой то символ преобразуется в символ, который в виндоус, считается символом конца файла - вот и заканчивается работа.
0
RUSya82
236 / 114 / 3
Регистрация: 15.10.2010
Сообщений: 395
08.11.2010, 23:29 #7
KuKu, согласен. При написании Лабы по методам и средствам защиты информации, во время считывания зашифрованного файла, вставала именно такая проблема. Один из символов, при шифровании преобразовывался в символ конца файла. И файл не считывался до конца. Все зависело от вводимого пароля
0
accept
4823 / 3244 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
09.11.2010, 01:56 #8
Цитата Сообщение от RUSya82
Один из символов, при шифровании преобразовывался в символ конца файла.
это как ?
запиши в файл 256 разных символов и прочитай их обратно
0
RUSya82
236 / 114 / 3
Регистрация: 15.10.2010
Сообщений: 395
09.11.2010, 06:38 #9
Ну например, если открывать и закрывать файл в текстовом, а не в бинарном режиме, и с помощью eof попытаться считать зашифрованный файл до конца - может ничего не выйти. Т.к. она возвращает true после прочтения маркера конца файла. И в зависимости от пароля и типа преобразований, файл может считаться полностью, может несколько строк, а может вообще несколько символов.
0
Coler
0 / 0 / 0
Регистрация: 01.10.2009
Сообщений: 6
09.11.2010, 07:50  [ТС] #10
Ну если не как символы читать то получилось сделать, а после тестов понял, что стрелочка действительно интерпретируется как конец файла. Единственная проблема осталась в том, что у меня класс с шифрованием поддерживает как входной массив char *data, а из поля richTextBox я считываю строку типа String^. И при перекодировании иногда символы меняются. Из-за этого после цикла расшифровки-зашифровки начальный и конечный тексты не совпадают на пару символов...
C++
1
2
IntPtr ptr = Marshal::StringToHGlobalAnsi(String);
                char* char_str = (char*)ptr.ToPointer();
пробовал также чтение-запись из файла
C++
1
2
3
4
5
6
7
8
9
10
StreamWriter^ sw = gcnew StreamWriter("Crypto.txt",false,Encoding::GetEncoding(1251));
                sw->Write(richTextBox1->Text);
                sw->Close();                
 
                ifstream Datamas ("Crypto.txt", ios::binary | ios::in );        
                Datamas.seekg (0, std::ios::end);
                size = Datamas.tellg();
                Datamas.seekg (0, std::ios::beg);
                Datamas.read(data,size);
                Datamas.close();
0
accept
4823 / 3244 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
09.11.2010, 10:49 #11
Цитата Сообщение от RUSya82
Т.к. она возвращает true после прочтения маркера конца файла.
у тебя есть код, где файл читается не до конца из-за какого-то символа ?
0
RUSya82
236 / 114 / 3
Регистрация: 15.10.2010
Сообщений: 395
09.11.2010, 11:31 #12
Да, есть. Только он в Borland C++ Builder6 сделан.
0
KuKu
1558 / 1036 / 78
Регистрация: 17.04.2009
Сообщений: 2,987
09.11.2010, 11:57 #13
Цитата Сообщение от Coler Посмотреть сообщение
начал тестить для других текстов и выявил странную закономерность: перестает считывать после определенного символа. а именно "". Может кто-нибудь подскажет как решить эту проблему?
(скопируйте этот символ из первого поста и посмотрите его номер в ASCII таблице)
у этого символа код 26 в десятично => 0x1A в шестнадцатеричной.
В DOS и Microsoft Windows конец файла кодируется символом 0x1A,
- от вики.
0
fasked
Эксперт С++
4945 / 2525 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
09.11.2010, 12:17 #14
Coler, при шифрование нельзя работать со строками работать надо с байтовыми массивами. это концептульано разные вещи.
0
Coler
0 / 0 / 0
Регистрация: 01.10.2009
Сообщений: 6
09.11.2010, 18:50  [ТС] #15
Спасибо всем за подсказку, получилось все нормально сделать, шифрует на ура. требовалось реализовать алгоритм шифрования А5 (используется в GSM сетях)...
Единственное что меня напрягает - окошки рисовал используя .NET, и теперь программа требует установленный NET Framework. и как мне объяснили бороться с этой проблемой бесполезно. и вообще она компилится как-то криво, надо в настройках покопаться - а то боюсь на компах без вижуал студио она не запустится..
0
09.11.2010, 18:50
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.11.2010, 18:50
Привет! Вот еще темы с ответами:

Ошибка, при считывании инфы с файла... - C++
Вот есть код:#include &lt;iostream.h&gt; #include &lt;conio.h&gt; #include &lt;string.h&gt; #include &lt;fstream.h&gt; #include &lt;stdio.h&gt; #include...

Сбивается указатель при считывании из файла - C++
Сбивается указатель, считывается не то значение (вместо '1' считывается пробел и всё летит). Но если открыть этот файл в WordPad'e добавить...

Конец файла при потоковом считывании - C++
if (fin.eof()==0){ cout &lt;&lt; &quot;aaa&quot;; int asa; asa = (int)buf; fout.write((char*)buf, sizeof(buf - asa)); } вот...

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


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

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