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

Истинность конца файла - C++

Восстановить пароль Регистрация
 
SMYH
 Аватар для SMYH
2 / 2 / 0
Регистрация: 23.10.2013
Сообщений: 38
23.06.2014, 21:04     Истинность конца файла #1
Суть в чем.
Есть реализация криптосистемы МакЭлисса. В входном текстовом файле считываются символы, символы разбиваются на биты, из битов формируются слова, слова умножаются на открытый ключ, из битов кодовых слов формируются символы в выходной файл. И дело в том, что во время кодирования может получится символ конца файла (EOF или как его читает NPP "SUB").
При декодировании текстовый файл открывается бинарно, и читается пока файл не кончится. Как-то так:
C++
1
2
3
4
ifstream input(pathToFile, ios::in||ios::binary);
while(!input.eof()){
    //reading-coding
}
eof() принимает этот "ложный" конец файла за истинный, и прерывает цикл, в результате чего сообщение декодируется не полностью.


Поэтому вопрос: как проверить, является ли этот "конец файла" настоящим? Можно ли как-то перейти к след символу? Даже если это будет истинный EOF.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
23.06.2014, 21:46     Истинность конца файла #2
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от SMYH Посмотреть сообщение
eof() принимает этот "ложный" конец файла за истинный, и прерывает цикл,
Вообще-то, при открытии файла в бинарном режиме, такого не должно быть.
C++
1
ifstream input(pathToFile, ios::in | ios::binary);
Добавлено через 1 минуту
Читаете как?
SMYH
 Аватар для SMYH
2 / 2 / 0
Регистрация: 23.10.2013
Сообщений: 38
23.06.2014, 22:08  [ТС]     Истинность конца файла #3
C++
1
input.get(current_in_char);
Добавлено через 2 минуты
Создается отчет о декодировании, в котором ясно видно, что чтение кодированного файла обрывается после того как указатель остановиться на этом "ложном" EOF.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
23.06.2014, 22:35     Истинность конца файла #4
Странно это всё. input.eof() ориентируется не на считывание EOF (которого в файле, в общем-то, и нет), а на размер файла. В коде, при чтении, никаких дополнительных проверок на EOF нет? Среда какая?

Добавлено через 14 минут
Если можете, то выложите файл, с ложным EOF, я его проверю на чтение.
SMYH
 Аватар для SMYH
2 / 2 / 0
Регистрация: 23.10.2013
Сообщений: 38
23.06.2014, 22:36  [ТС]     Истинность конца файла #5
visual studio 2012.
Вот код.
Кликните здесь для просмотра всего текста

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
void McElicce::decodeFileWithLog(char* pathToFile){
    ofstream dlog("decode_log.txt", ios::out);
    
    ifstream input(pathToFile, ios::in||ios::binary);
    ofstream output("fromBob.txt", ios::out);
    queue<bool> waitingBitsIn;
    queue<bool> waitingBitsOut;//sd
    vector<bool> inputLog;
    vector<bool> outputLog;
    
    Matrix trans_check = standard_check.transpose();
    while(!input.eof()){
 
        if(waitingBitsIn.size()>=length){
            Matrix from_stream_word(length, 1);
            for(int i = 0; i<length; i++){
                from_stream_word.matrix[0][i] = waitingBitsIn.front();
                inputLog.push_back(from_stream_word.matrix[0][i]);
                
                waitingBitsIn.pop();
            }
            dlog<<"\nFrom stream: "<<from_stream_word<<endl;
            Matrix v_word = from_stream_word*rand_P.invertible();
            dlog<<"V word: "<<v_word<<endl;
            
            Matrix cur_syndrome = v_word*standard_check.transpose();
            dlog<<"Syndrome: "<<cur_syndrome<<endl;
 
            Matrix mistake(length,1);
 
            for(int i = 0; i<syndroms.size(); i++){
                if(cur_syndrome==syndroms[i]){
                    mistake = mistake_words[i];
                    break;
                }
            }
            dlog<<"Mistake: "<<mistake<<endl;
 
            v_word = v_word+mistake;
            dlog<<"Corr. word: "<<v_word<<endl;
            Matrix word(dimension,1);
            bool is_word_exist = false;
            
            int number_of_words = pow(2,dimension);
            for(int i = 0; i<number_of_words; i++){
                if(code_words[i]==v_word){
                    word = info_words[i];
                    is_word_exist = true;
                    break;
                }
            }
            dlog<<"Word: "<<word<<endl;
            char currentOutChar = 0;
            if(is_word_exist){
                dlog<<"Word exist: ";
                Matrix real_word = word*rand_S.invertible();
                dlog<<"Real word: "<<real_word<<endl;
                for(int i = 0; i<word.width; i++){
                    waitingBitsOut.push(real_word.matrix[0][i]);
                    outputLog.push_back(real_word.matrix[0][i]);
                }
                while(waitingBitsOut.size() >= 8){
                    currentOutChar = 0;
                    for(int i = 7; i >= 0; i--){
                        if(waitingBitsOut.front()){
                            currentOutChar+= pow(2,i);
                        }
                        waitingBitsOut.pop();
                    }
                    output.put(currentOutChar);
                    dlog<<"PUT CHAR: "<<currentOutChar<<endl;
                }
            }
            else{
                dlog<<"Word doesn't exist.\n";
                word = Matrix(dimension,1);
                for(int i = 0; i<dimension; i++){
                    waitingBitsOut.push(word.matrix[0][i]);
                    outputLog.push_back(word.matrix[0][i]);
                }
                while(waitingBitsOut.size() >= 8){
                    currentOutChar = 0;
                    for(int i = 7; i >= 0; i--){
                        if(waitingBitsOut.front()){
                            currentOutChar+= pow(2,i);
                        }
                        waitingBitsOut.pop();
                    }
                    output.put(currentOutChar);
                    dlog<<currentOutChar<<endl;
                }
            }
        }
        else{
            char currentInChar = 0;
            input.get(currentInChar);
            dlog<<"Get char: "<<currentInChar<<endl;
            //Make it rain. Joke. Make it binary
            dlog<<"ASCII: ";
            for(int i = 7; i >= 0; i--){
                char copy = currentInChar;
                copy>>=i;
                copy<<=7;
                if(copy){
                    dlog<<1;
                    waitingBitsIn.push(1);
                }
                else{
                    dlog<<0;
                    waitingBitsIn.push(0);
                }
            }
            dlog<<endl;
        }
    }
    for(int i = 0; i<inputLog.size(); i++){
        if((i!=0)&&(i%8==0)) dlog<<" ";
        dlog<<inputLog[i];
    }
    dlog<<endl;
    for(int i = 0; i<outputLog.size(); i++){
        if((i!=0)&&(i%8==0)) dlog<<" ";
        dlog<<outputLog[i];
    }
    dlog<<endl;
    input.close();
    output.close();
    dlog.close();
 
}
SMYH
 Аватар для SMYH
2 / 2 / 0
Регистрация: 23.10.2013
Сообщений: 38
23.06.2014, 22:39  [ТС]     Истинность конца файла #6
Кодированный файл.
Вложения
Тип файла: txt result.txt (108 байт, 3 просмотров)
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
23.06.2014, 22:55     Истинность конца файла #7
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от SMYH Посмотреть сообщение
Вот код.
Цитата Сообщение от SMYH Посмотреть сообщение
ifstream input(pathToFile, ios::in||ios::binary);
Я вам написал, как нужно, вы всё равно пишите по-своему:
Цитата Сообщение от alsav22 Посмотреть сообщение
ifstream input(pathToFile, ios::in | ios::binary);
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.06.2014, 23:01     Истинность конца файла
Еще ссылки по теме:

Считывание до конца файла C++
символ конца файла C++
C++ Определение конца файла

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

Или воспользуйтесь поиском по форуму:
SMYH
 Аватар для SMYH
2 / 2 / 0
Регистрация: 23.10.2013
Сообщений: 38
23.06.2014, 23:01  [ТС]     Истинность конца файла #8
Не заметил разницы сначала. Теперь работает.
Yandex
Объявления
23.06.2014, 23:01     Истинность конца файла
Ответ Создать тему
Опции темы

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