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

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

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

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 11.02.2011, 23:09   #1
VirtualAngel
Новичок
Джуниор
 
Регистрация: 11.02.2011
Сообщений: 2
Вопрос Чтение\запись в файл

Такая проблема: записываю в бинарный файл числа типа long double, после чтения из этого файла теряются данные - получается к примеру не 12, а 11,973444. Но с бинарными файлами такого быть не должно! Подскажите кто знает как это исправить. Работаю с потоками, использую для записи перегрузку >> ... Помогите срочняк!!!!

Код:
 // Работа с файлами.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <windows.h>
#include <math.h>



using namespace std;

char next;
int i;
long double ksimbol;
long double p;
long double q;
long double AKryptSimbol;
long double KryptSimbol;


//Размер имени файла
const int NameSize = 40;

//Массив для имени файла
char FileName[NameSize];
char KryptFile[NameSize];


void KRYPT() {

//Получение имени файла
cout<<"\nВведите имя текстового файла и путь к нему: \n";
cin >> FileName;

//Получение имени зашифрованного файла и пути к нему
cout<<"\nВведите имя шифруемого файла и путь к нему (например C:'\\'KryptFile.bin) :\n";
cin >> KryptFile;


ifstream inFile;
inFile.open(FileName);

ofstream outFile;
outFile.open(KryptFile);


//Проверка правильности открытия файла FileName
if (!inFile) {
cout<<"\n Ошибка при открытии файла\n"<<" "<<FileName<<"!!!";
}

if (!outFile) {
cout<<"\n Ошибка при открытии файла\n"<<" "<<KryptFile<<"!!!";
}



cout<<"\n Введите два простых числа.\n Сохраните их в тайне!!! Они определят ключ к шифру!!!\n";
cin>>p;
cin>>q;

long double n = p * q;
long double f = (p-1)*(q-1);
long double d = n - f;
long double e = 1/(fmod(d, n));

while(inFile>>next) {
if (next == 'q') { i =12; KryptSimbol = fmod(pow(i, e), n);}
if (next == 'w') { i =31; KryptSimbol = fmod(pow(i, e), n);}
if (next == 'e') { i =22; KryptSimbol = fmod(pow(i, e), n);}
outFile<<KryptSimbol<<" ";
}


inFile.close();
outFile.close();
}




void AKRYPT() {

//Получение имени зашифрованного файла и пути к нему
cout<<"\nВведите имя зашифрованного файла и путь к нему (например C:'\\'KryptFile.bin) :\n";
cin >> KryptFile;


ifstream inFile;
inFile.open(KryptFile);

if (!inFile) {
cout<<"\n Ошибка при открытии файла\n"<<" "<<KryptFile<<"!!!";
}

cout<<"\n Введите два простых числа.\n Сохраните их в тайне!!! Они определят ключ к шифру!!!\n";
cin>>p;
cin>>q;

long double n = p * q;
long double f = (p-1)*(q-1);
long double d = n - f;

while(inFile>>KryptSimbol) {

AKryptSimbol = fmod(pow(KryptSimbol, d) ,n);
cout<<AKryptSimbol<<" ";

if (AKryptSimbol == 12) { cout<<"q";}
if (AKryptSimbol == 31) { cout<<"w";}
if (AKryptSimbol == 22) { cout<<"e";}

}

inFile.close();
}



void _tmain(int argc, _TCHAR* argv[]) {
SetConsoleOutputCP(1251);


KRYPT();

AKRYPT();



getchar();
getchar();


}
Код такой. Прога реализует RSA шифрование(должна реализовать). Создайте текстовый файл, загоните в него символ Q. При шифровке он заменяется на число 12, которое должно получится после дешифровки. Посмотрите пожалуйста и помоги.


________
Код нужно оформлять по правилам:
тегом [CODE]..[/СODE] (это кнопочка с решёточкой #)
Не забывайте об этом!

И не надо кросспост делать, это запрещено правилами форума!


Модератор.

Последний раз редактировалось Serge_Bliznykov; 12.02.2011 в 08:23.
VirtualAngel вне форума Ответить с цитированием
Старый 12.02.2011, 08:34   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

то, что Вы пишете, то и читаете.
А то, что операция возведения вещественного числа в степень (как, впрочем, и любые операции с вещественными числами!) имеет погрешности округления - это для Вас тайна ?...

Вы пишете в файл KryptSimbol
KryptSimbol = fmod(pow(i, e), n);

а после чтения из файла Вы это значение не выводите,
вы выводите значение:
AKryptSimbol = fmod(pow(KryptSimbol, d) ,n);

p.s. думаю, что решение Вашей проблемы - это переход к целочисленным вычислениям - выкидывайте свои double, заменяйти их на целый тип (только смотрите, чтобы размерности хватило. ну, например, int64) и вперёд!...

p.p.s. реализацию RSA не разбирал. а язык С, к сожалению, совсем не знаю...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 12.02.2011, 12:54   #3
VirtualAngel
Новичок
Джуниор
 
Регистрация: 11.02.2011
Сообщений: 2
По умолчанию

Спасибо за идею! За коряво поданный код извиняюсь.
VirtualAngel вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Чтение и запись из/в файл Pirotexnik Общие вопросы C/C++ 7 28.01.2011 16:54
Чтение и запись в файл Dycek Общие вопросы C/C++ 0 18.01.2011 15:04
Чтение и запись в файл. Ky3Heu, Помощь студентам 0 01.01.2010 11:24
Чтение и запись в файл deagle05 Общие вопросы C/C++ 3 22.12.2009 00:11
Чтение и Запись текста из\в файл(а), C++ FastDead2 Помощь студентам 20 14.05.2009 00:01