Ошибка при получении строки из конца файла - PullRequest
1 голос
/ 21 августа 2010

У меня есть простое приложение, которое берет текст и пароль, генерирует текст, записывает его в файл, затем пытается извлечь и расшифровать его.Перед шифрованием генерируется «pad», представляющий собой строку, сгенерированную из пароля с длиной текста.Проблема возникает, когда я пытаюсь получить текст, потому что независимо от того, как я пытаюсь, я продолжаю извлекать неправильный текст, потому что он не соответствует длине пароля.

cout << " !!! DEBUG ONLY. CHANGE MAIN CODE BEFORE RELEASE !!!\n";
string text, password, file;
cout << "Please enter the text you would like encrypted: ";
getline(cin, text);
cout << "Please enter the password for creating the cipher: ";
getline(cin, password);
cout << "Please enter the file path: ";
getline(cin, file);
password = GeneratePad(password, text.size());
string separator = "30436f4a57e831406e8c0ef203923fe3ba9d0ac4TB5Mi4b33A";
ofstream mann(file.c_str(), ios::app);
mann << "\n" << separator << CryptText(text, password);
mann.close();
cout << " !!! DEBUG ONLY. CHANGE MAIN CODE BEFORE RELEASE !!!\n";
ifstream frau(file.c_str(), ios::binary);
string foobar;
bool barfoo = false;
string decrypted;
while (!barfoo)
{
    getline(frau, foobar);
    if(foobar.find(separator) != string::npos){
        decrypted += foobar.substr(separator.length() + 1);
        cout << "SUBSTR " << foobar.substr(separator.length() + 1);
        barfoo = true; }    }
while (getline(frau, foobar))
{
    decrypted += foobar;
}
string decrypted2;
cout << "    LEN      " << decrypted.length() << "     !!!!!     " << decrypted << endl;
decrypted2 = CryptText(decrypted, password);
cout << decrypted2 << endl;
system("PAUSE");

Вещи, которые, кажется, не являютсяНеобходимы только для отладки (например, для вывода необработанного зашифрованного текста и т. д.).Есть идеи, почему это происходит?

Ответы [ 2 ]

2 голосов
/ 21 августа 2010

Проблема 1: вы открываете выходной файл в текстовом режиме, но читаете его обратно в двоичном режиме.

std::ofstream mann(file.c_str(), std::ios::app|std::ios::binary);

Проблема 2: ваши зашифрованные данные, вероятно, больше не являются текстом ASCII.Он может содержать специальные символы, такие как \ n или ^ Z, или даже встроенные символы \ 0.Вы должны использовать неотформатированный ввод / вывод, такой как read () и write () вместо getline () и <<.</p>

Дополнительные комментарии:
Не использовать систему ("PAUSE") ;.Это плохой стиль и делает программу излишне зависимой от системы.Просто используйте обычный ввод / вывод C ++, чтобы написать сообщение паузы и дождаться нажатия клавиши return.

std::cout << "Press return to continue" << std::endl;
std::getline();

Я рекомендую не использовать "использование пространства имен std", а просто использовать спецификатор std :: при необходимости,Это держит вещи немного чище.

0 голосов
/ 21 августа 2010

Я сделал следующие 2 правки:

ofstream mann(file.c_str(), ios::app|ios::binary);
while (getline(frau, foobar))   
{   
decrypted += foobar;
decrypted += "\n";
} 

Когда я открыл файл для чтения, я также добавил ios :: binary, а когда я добавлял в расшифрованную строку, я добавил «\ n», который удалялся «getline». Теперь он отлично работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...