Forum huvudsida -> Programmering -> C++ filhantering för nybörjare
Sidor: 1
Xynz | 18:21 - 30:e November 2006 | Post #1 | |
Medlem Inlägg: 4 Skicka PM |
Hejsan, jag har hållt på med Dev-C++ i några dagar och bestämde mig för att göra ett krypteringsprogram som krypterar tex "hej" till "7382047" till en .txt fil. Detta är vad jag gjort än så länge #include<iostream> #include<string> #include<fstream.h> using namespace std; int main() { ofstream file; int A=7; int B=23; int C=16; int D=39; int E=86; int F=51; int G=97; int H=45; int I=66; int J=103; int K=148; int L=112; int M=128; int N=153; int O=136; int P=170; int Q=169; int R=196; int S=181; int T=254; int U=235; int V=217; int W=222; int X=247; int Y=289; int Z=265; int AA=272; int AE=290; int OE=308; string val; string text; string filnamn; int par; par = 100; cout << "\n\n" << "skriv in om du vill kryptera eller dekryptera" << "\n\n\n"; cout << "val: "; cin >> val; if (val == "kryptera") { while (par >= 0) { cout << "skriv in medelandet du vill ha krypterat(en bokstav sen enter osv): "; cin >> text; if (text == "a") { file.open ("dokument.txt"); file << A << endl; file.close(); } else if (text == "b") { file.open ("dokument.txt"); file << B; file.close(); } else if (text == "c") { file.open ("dokument.txt"); file << C; file.close(); } else if (text == "d") { file.open ("dokument.txt"); file << D; file.close(); } else if (text == "e") { file.open ("dokument.txt"); file << E; file.close(); } else if (text == "f") { file.open ("dokument.txt"); file << F; file.close(); } else if (text == "g") { file.open ("dokument.txt"); file << G; file.close(); } else if (text == "h") { file.open ("dokument.txt"); file << H; file.close(); } else if (text == "i") { file.open ("dokument.txt"); file << I; file.close(); } else if (text == "j") { file.open ("dokument.txt"); file << J; file.close(); } else if (text == "k") { file.open ("dokument.txt"); file << K; file.close(); } else if (text == "l") { file.open ("dokument.txt"); file << L; file.close(); } else if (text == "m") { file.open ("dokument.txt"); file << M; file.close(); } else if (text == "n") { file.open ("dokument.txt"); file << N; file.close(); } else if (text == "o") { file.open ("dokument.txt"); file << O; file.close(); } else if (text == "p") { file.open ("dokument.txt"); file << P; file.close(); } else if (text == "q") { file.open ("dokument.txt"); file << Q; file.close(); } else if (text == "r") { file.open ("dokument.txt"); file << R; file.close(); } else if (text == "s") { file.open ("dokument.txt"); file << S; file.close(); } else if (text == "t") { file.open ("dokument.txt"); file << T; file.close(); } else if (text == "u") { file.open ("dokument.txt"); file << U; file.close(); } else if (text == "v") { file.open ("dokument.txt"); file << V; file.close(); } else if (text == "w") { file.open ("dokument.txt"); file << W; file.close(); } else if (text == "x") { file.open ("dokument.txt"); file << X; file.close(); } else if (text == "y") { file.open ("dokument.txt"); file << Y; file.close(); } else if (text == "z") { file.open ("dokument.txt"); file << Z; file.close(); } else if (text == "å") { file.open ("dokument.txt"); file << AA; file.close(); } else if (text == "ä") { file.open ("dokument.txt"); file << AE; file.close(); } else if (text == "ö") { file.open ("dokument.txt"); file << OE; file.close(); } cin.get(); } system ("pause"); } return 0; } Det jag nu behöver hjälp med är att för varje ny bokstav som skrivs in raderas de gamla siffrorna i dokumentet och det funkar ej att skriva flera bokstäver på samma rad, då krypteras bara den första. Jag har även börjat fundera på dekrypteringen men där har jag ingen aning om hur jag ska fixa det. så de får bli ett senare problem. ------------------------- Ingen signatur! |
ozamosi | 19:47 - 30:e November 2006 | Post #2 | |
Administratör Inlägg: 1129 Skicka PM |
Gå till cppreference.com. Där finns länken C++ I/O, som vi givetvis klickar på. Vi klickar vidare på open, eftersom det är det vi använder för att öppna filen. Där får vi se att det finns ett vafritt argument, mode. Genom att klicka på länken i beskrivningen får vi se http://cppreference.com/io_flags.html#mode_flags - den översta av flaggorna är ios::app, vilket låter precis som vad vi vill ha. Jag vet inte om det räcker med ios::app, eller om man måste skriva ios::app|ios::out - du får testa själv, eller vänta på att någon som vet svarar. ------------------------- Ljusblå |
Xynz | 16:12 - 1:a December 2006 | Post #3 | |
Medlem Inlägg: 4 Skicka PM |
Tackar, Nu funkar det iaf mer eller mindre. Kan fortfarande inte skriva flera bokstäver på samma rad, Vill gärna ha tips på hur man fixar det med. Typ något sätt att ta "text" stringen och jämföra den med alla "if" satserna en efter en? Vill även fortfarande ha tips på dekryptering ifall någon har en idé ------------------------- Ingen signatur! |
Nissebosselasse | 02:23 - 2:a December 2006 | Post #4 | |
Medlem Inlägg: 490 Skicka PM |
Jag vet inte hur mycket C++ du har hållit på med, men här kommer lite tips (du får säga stopp om det låter som rappakalja). Först lite allmänna tips som kan vara bra att följa redan från början:
Jag antar att du vill ersätta varje bokstav i en mening med ett specifikt tal? Alla "A" blir 7, alla "B" blir 23, o.s.v.? Du skulle då kunna skapa en "karta", som kopplar ihop en bokstav med en siffra (eller ett annat tecken). På så vis slipper du deklarera och definiera en variabel för varje möjlig kombination (och som du säkert själv märkte när du skrev in det här, så blir det ganska jobbigt efter ett tag med så många variabler!). Så istället för att lägga in en massa int BOKSTAV = SIFFRA, så lägger du bara till bokstaven (och siffervärdet som ska motsvara bokstaven) i den här "kartan". Hur man kan göra detta kommer sen. Vad bör då programet göra? Du vill:
Den första punkten har du i princip redan gjort.
Jag tänkte smälla in punkt tre redan här, faktiskt. Du öppnar och stänger filen för varje bokstav, men det är inte nödvändigt. När du skapar instanser av std::ofstream (eller std::ifstream), så kommer de stänga filerna automatiskt när de förstörs (t.ex. vid programmets avslut). Så vi öppnar filen för skrivning:
Du bör alltid kolla om det verkligen gick att öppna/skapa filen. Detta gör du med medlemsfunktionen is_open, som returnerar sant om det gick (logiskt nog... ). Då ska vi göra den andra punkten (ersätta varje bokstav med ett specifikt tal). Det är egentligen här vår "karta" kommer in, men jag tänkte börja med en enklare variant först, och ta kartexemplet sist. Vi ska alltså loopa igenom vår textsträng, bokstav för bokstav. Man kan göra det här på två sätt (säkerligen fler). Vi gör det på enklast möjliga med ett heltal:
För enkelhetens skull tänkte jag vi kunde använda ASCII-värdet (det siffervärde som motsvarar bokstaven) som "kod". ASCII-värdet för bokstaven A är 65, 66 för B, 67 för C o.s.v. Vi vill nu skriva dessa tal till vår fil, som vi öppnade tidigare.
(Här finns mer info om "omkastning": http://www.informit.com/guides/content.asp?g=cplusplus&seqNum=134&rl=1). Anledningen till att vi dessutom skriver dit ett mellanslag, är för att vi ska kunna ta ut siffran om vi vill dekryptera texten. Till exempel: om vi hade krypterat texten "ABC" så skulle vi fått siffrorna 65, 66, 67 (ASCII-värdena för resp. bokstav). Om vi skriver siffrorna efter varandra till filen, så ser det ut så här:
Här är hela källkoden än så länge:
Observera dock att std::cin >> text bara läser till första mellanslaget (eller radslut). Skriv in lite olika bokstäver, och titta sedan i filen "dokument.txt", så ser du hur det är uppbyggt. Nu vore det bra om vi kunde testa och se om vi kunde dekryptera vårt meddelande också! Här gäller det bara att tänka tvärtom:
,,n en gång för enkelhetens skull, börjar jag om med en ny fil. I ett riktigt projekt hade vi lagt krypterings- och dekrypteringsrutinen i varsin funktion istället. Vi börjar med att öppna filen:
Vi ska läsa från filen tills den tar slut, alltså skapar vi en loop som avbryts när just detta inträffar. Vi läser heltal från filen (vilket var just det vi skrev till den i första början - vilken planering!). Dessutom klämmer vi in sista punkten här också, nämligen att omvandla siffran till en bokstav, samt skriva ut det på skärmen:
Sådärja. Jag vet jag skrev att jag tänkte ta med ett kartexempel också, men det får vänta (känns som om det här meddelandet är tillräckligt långt). Idé:
Testa dig fram, och fråga om något är oklart. ---- EDIT: Indy? Kan du ändra så att [ source=cpp] inte visar kodorden med turkos färg? Antingen har jag starr, eller så är det omöjligt att se de orden med den färgkombinationen... ------------------------- http://pushingcows.se Gula Nallen Senast redigerad 02:25 - 2:a December 2006 |
Xynz | 18:44 - 14:e December 2006 | Post #5 | |
Medlem Inlägg: 4 Skicka PM |
Hejsan, Har varit iväg i några dagar. Det är därför jag inte svarat. Din kod funkade fint och jag har redan fixat en helt ok program nu det där med omkastning fattade jag inte riktigt innan men länken var bra och tror jag fattat det nu =) Tack så mycket för hjälpen ------------------------- Ingen signatur! |
Xynz | 19:19 - 16:e December 2006 | Post #6 | |
Medlem Inlägg: 4 Skicka PM |
EDIT: fixade det själv ------------------------- Ingen signatur! Senast redigerad 19:24 - 16:e December 2006 |
Sidor: 1
Forum huvudsida -> Programmering -> C++ filhantering för nybörjare
Du får inte posta i den här tråden | Till toppen
Datum
2024-05-01 18:45
Vecka: 18
Besökare
Inloggade: 0
Gäster: 605
Medlemmar
Medlemmar: 53576
Forum
Senaste inlägget: HAHA MÄNNISKAN LEVER ÄN (13:45 - 18:e Januari 2019, av Hetzz)
Wiki
Senaste ändringen:
3D (rev: 1, tid: 09:40 - 13:e November 2015)
Chatt
#blinkenlights @ Libera.Chat
Gratis shellkonton för IRC, webbsidor mm.