Litet problem med krypteringsprogram i C++
Hej.
Jag håller på att skriva ett enkelt krypteringsprogram i C++, men efter lite ändringar i koden för att göra den mer effektiv så fungerar inte programmet som jag vill. Här kommer koden:
#include <iostream>
#include <algorithm>
#include <string>
#include <fstream>
using namespace std;
using std::cout;
using std::cin;
string get_line();
void write_line(char* sentence);
void encrypt(char* sentence);
void decrypt(char* sentence);
string get_line()
{
ifstream in;
string text;
cout << "Note: Everything in file must be on one line!\n";
in.open("unprocessed.txt");
getline(in, text);
while (in)
{
getline(in, text);
}
return text;
}
void write_line(char* sentence)
{
ofstream out;
out.open ("processed.txt");
out << sentence <<endl;
out.close();
return;
}
void encrypt(char* sentence)
{
for( int i=0; sentence[i] != '\0'; ++i ) ++sentence[i];
reverse (sentence, sentence + strlen (sentence));
}
void decrypt(char* sentence)
{
reverse (sentence, sentence + strlen (sentence));
for( ; *sentence != '\0'; ++sentence ) --(*sentence);
}
int main()
{
int answer;
char sentence[2000];
string sentence2;
string fromfile;
do
{
cin.ignore();
cout << "What would you like to do?\n";
cout << "-------------------------------------------\n";
cout << "1. Encrypt text in a file\n";
cout << "2. Encrypt a sentence within this program\n";
cout << "-------------------------------------------\n";
cout << "3. Decrypt text in a file\n";
cout << "4. Decrypt a sentence within this program\n";
cout << "-------------------------------------------\n";
cout << "5. Exit.\n";
cin >> answer;
switch(answer)
{
case '1':
fromfile = get_line();
strcpy_s(sentence, fromfile.c_str());
encrypt(sentence);
write_line(sentence);
system ("pause");
break;
case '2':
cin.ignore();
cout << "Write your sentence here: \n";
getline (cin, sentence2);
strcpy_s(sentence, sentence2.c_str());
encrypt(sentence);
cout << "The encrypted version of your sentence is: " << sentence << "\n";
system ("pause");
break;
case '3':
fromfile = get_line();
strcpy_s(sentence, fromfile.c_str());
decrypt(sentence);
write_line(sentence);
system ("pause");
break;
case '4':
cin.ignore();
cout << "Write your sentence here: \n";
getline (cin, sentence2);
strcpy_s(sentence, sentence2.c_str());
decrypt(sentence);
cout << "The decrypted version of your sentence is: " << sentence << "\n";
system ("pause");
break;
default:
cout << "Input not accepted\n";
}
}
while(answer != '5');
return 0;
}
Jag har två frågor till er kunniga här på forumet:
1. Programmet startar fint och allt ser ut så som jag vill att det ska göra i menyerna. När jag väljer ett av alternativen beskrivna i main-funktionen och trycker retur så får jag - oavsett vilken siffra jag trycker - Input not accepted. Vad jag vill att att programmet endast ska ge det meddelandet om man trycker in fel siffra (alltså inte 1, 2, 3, 4 eller 5). Vad har jag gjort för fel?
2. Jag har länge haft problemet att funktionen get_line() bara har returnerat den sista raden i txt-filen.
string get_line()
{
ifstream in;
string text;
cout << "Note: Everything in file must be on one line!\n";
in.open("unprocessed.txt");
getline(in, text);
while (in)
{
getline(in, text);
}
return text;
}
Om jag till exempel skriver in "Hej. Vad gör du?" så får den med hela, men om jag skriver
"Hej.
Vad gör du?" så skickar den bara tillbaka "Vad gör du?" till krypteringsfunktionen. Jag tror jag vet vad som orsakar problemet, men inte hur jag ska lösa det. Är det inte så att funktionen läser in första raden i "text" och upptäcker sedan att filen inte är slut, så den läser in ytterligare en rad samtidigt som den förra försvinner. Tillslut är det bara den sista raden kvar i "text" och först då returnerar funktionen "text" (eftersom loopen avslutas när texten i filen är slut). Så finns det över huvud taget något sätt att få in många rader i 1 string (har sökt som en dåre på Google efter detta, men förgäves)eller måste jag ta till någon slags array-lösning?
Uppskattar verkligen all hjälp jag kan få, men försök att hålla saker och ting enkla eftersom jag är en nybörjare.
/Calle