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

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

Войти
Регистрация
Восстановить пароль
 
SMYH
2 / 2 / 0
Регистрация: 23.10.2013
Сообщений: 38
#1

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

23.06.2014, 21:04. Просмотров 392. Ответов 7
Метки нет (Все метки)

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


Поэтому вопрос: как проверить, является ли этот "конец файла" настоящим? Можно ли как-то перейти к след символу? Даже если это будет истинный EOF.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.06.2014, 21:04
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Истинность конца файла (C++):

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

Чтение файла с несколькими знаками конца файла - C++
В файле несколько раз встречается ноль, и ни как не получается прочитать его полностью. Как можно решить данную проблему ?

определения конца файла - C++
Как определить конец файла если я открываю файл fopen и считываю данные через freed ? int reedFileT(Dek *&ldek,Dek *&rdek) { ...

определение конца файла - C++
При чтении не получается выйти из цикла с помощью istream::eof(), было много вариантов причины ошибки,соот-но возникло пару вопросов ...

Чтение из файла с конца - C++
Добрый день, не могу реализовать такую штуку =) Хотелось бы имеющийся текстовый файл перезаписать с обратном порядке (все символы...

Определение конца файла - C++
помогите пожалуйста определить условие конца файла #include <iostream> #include <cstdio> #include <vector> using namespace std; ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
alsav22
5417 / 4813 / 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
2 / 2 / 0
Регистрация: 23.10.2013
Сообщений: 38
23.06.2014, 22:08  [ТС] #3
C++
1
input.get(current_in_char);
Добавлено через 2 минуты
Создается отчет о декодировании, в котором ясно видно, что чтение кодированного файла обрывается после того как указатель остановиться на этом "ложном" EOF.
alsav22
5417 / 4813 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
23.06.2014, 22:35 #4
Странно это всё. input.eof() ориентируется не на считывание EOF (которого в файле, в общем-то, и нет), а на размер файла. В коде, при чтении, никаких дополнительных проверок на EOF нет? Среда какая?

Добавлено через 14 минут
Если можете, то выложите файл, с ложным EOF, я его проверю на чтение.
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
2 / 2 / 0
Регистрация: 23.10.2013
Сообщений: 38
23.06.2014, 22:39  [ТС] #6
Кодированный файл.
Вложения
Тип файла: txt result.txt (108 байт, 3 просмотров)
alsav22
5417 / 4813 / 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);
SMYH
2 / 2 / 0
Регистрация: 23.10.2013
Сообщений: 38
23.06.2014, 23:01  [ТС] #8
Не заметил разницы сначала. Теперь работает.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.06.2014, 23:01
Привет! Вот еще темы с ответами:

Считывание до конца файла - C++
В каждой строке файла 2 целых числа. Нужно считать по 2 числа до конца файла и выводить в каждую строку сумму этих двух чисел. Раньше...

Условие конца файла - C++
Имеем функцию: void Inpfile (stud&amp; s) { ifstream base(&quot;base.txt&quot;); if(!base)std::cout &lt;&lt; &quot;Can't create input file&quot;; ...

Чтение запросов до конца файла - C++
Доброго времени суток, Помогите начинающему...Имеется задача.Само условие говорить не буду(не суть).Проблема состоит в том,что от меня...

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


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
23.06.2014, 23:01
Ответ Создать тему
Опции темы

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