/ Forside / Teknologi / Udvikling / C/C++ / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
C/C++
#NavnPoint
BertelBra.. 2425
pmbruun 695
Master_of.. 501
jdjespers.. 500
kyllekylle 500
Bech_bb 500
scootergr.. 300
gibson 300
molokyle 287
10  strarup 270
cin.getline ?
Fra : Søren Badstue


Dato : 25-10-01 20:59

Hejsa gruppe

Jeg er lige startet på DTU, hvor vi bl.a. skal lære C++.
Vi er nu nået til et projekt hvor vi skal kryptere et password, så jeg
kiggede lidt på nettet (mest for sjov) for at finde ud af en måde at
kryptere på. Jeg fandt nedenstående kode, som jeg stort set forstår. MEN:
Jeg kan ikke forstå hved cin.getline linierne skal bruges til. Jeg har
prøvet at lave om på dem, fjerne dem og erstatte dem med cin.get, men så gik
programmet bare amork. Er der nogle der har mulighed for at forklare en
stort set nybegynner, hvad disse linier gør godt for? Specielt den første
(som jeg har markeret med ** i siden), hvor det er en normal cin>> linie
ovenover. Det ville jeg da mene var nok til at få en karakter?

mvh
Søren

Koden:

// **************************************
// INCLUDE files for :XEncryptor v1.1
// **************************************
#include <iostream.h>
#include <stdio.h>
// **************************************
// Name: XEncryptor v1.1
// Description:Ecrypts any file with a key and very secure encryption.
// By: Marco Lugo
//
//
// Inputs:File to encrypt, file to save the encrypton, key to encrypt.
//
// Returns:None
//
// Assumes:None
//
// Side Effects:That on decrypting the output file is overwriten.
// This code is copyrighted and has limited warranties.
// Please see
http://www.1CPlusPlusStreet.com/xq/ASP/txtCodeId.1742/lngWId.3/qx/vb/scripts
/ShowCode.htm
// for details.
// **************************************

int main(void) // Main function, It also the only one here


{
// Declaring all variables, arrays and stuff
register int byte, workwme, key;
register long size_by_now = 0;
char FName[2][256], clean[2];
int choice;
FILE *IFile, *OFile;
// Start-Up and Menu showing
cout << " XEncryptor v1.1" << endl;
cout << " Author: Marco Lugo" << endl;
cout << endl;
cout << endl;
cout << " Select an option:" << endl;
cout << " |-------------------|" << endl;
cout << " | 1) Encode.|" << endl;
cout << " | 2) Decode.|" << endl;
cout << " | 3) Exit. |" << endl;
cout << " |-------------------|" << endl;
cout << " Enter your choice: ";
cin >> choice;
**cin.getline(clean, 2);
cout << endl;
cout << endl;
// Switch statement for choice
switch(choice)


{
// Encode
case 1:
cout << " Enter the filename of file to encrypt: ";
cin.getline(FName[0], 256, '\n'); // Get filename
cout << " Enter the filename of the file to saved the encrypted file
to: " << endl;
cout << " ";
cin.getline(FName[1], 256, '\n');
cout << " Enter the key to encrypt the file(can't have spaces): ";
cin >> key;//Get the key
cin.getline(clean, 2);
IFile = fopen(FName[0], "rb");//Open input file
if(!(IFile))//Checking file existance


{
cout << " File " << FName[0] << " not found..." << endl;
break;
}
OFile = fopen(FName[1], "wb");// Open output file
while(byte != -1) // While byte not equal to -1


{
byte = fgetc(IFile); // Get byte from file
if(byte == -1) break;
workwme = byte;
size_by_now++;
workwme = (~byte) ^ key;
fputc(workwme, OFile);
}
fclose(IFile);
fclose(OFile);
break;
// Decode
case 2:
cout << " Enter the filename of file to decrypt: ";
cin.getline(FName[0], 256, '\n'); // Get filename
cout << " Enter the filename of file you want to save the decrypted
file to: " << endl;
cout << " ";
cin.getline(FName[1], 256, '\n');
cout << " Enter the key to decrypt the file(can't have spaces): ";
cin >> key;// Get the key
cin.getline(clean, 2);
IFile = fopen(FName[0], "rb");//Open input file
if(!(IFile))// Checking file existance


{
cout << " File " << FName[0] << " not found..." << endl;
break;
}
OFile = fopen(FName[1], "wb");// Open output file
while(byte != -1) // While byte not equal to -1


{
byte = fgetc(IFile); // Get byte from file
if(byte == -1) break;
workwme = byte;
size_by_now++;
workwme = (~byte) ^ key;
fputc(workwme, OFile);
}
fclose(IFile);
fclose(OFile);
break;
// Exit
case 3: break;
}
// Saying bye-bye to the user
cout << endl;
cout << endl;
cout << endl;
cout << " Thanks for using XEncrytor, hope It was useful for you." <<
endl;
cout << " XEncryptor was made in C/C++ with the Dev-C++ 4.0 compiler."
<< endl;
cout << " Marco Lugo" << endl;
cout << endl;
cout << " Press ENTER to exit...";
cin.get();
return(0);
}




 
 
Niels (27-10-2001)
Kommentar
Fra : Niels


Dato : 27-10-01 12:39



------klip---------


> cout << " Select an option:" << endl;
> cout << " |-------------------|" << endl;
> cout << " | 1) Encode.|" << endl;
> cout << " | 2) Decode.|" << endl;
> cout << " | 3) Exit. |" << endl;
> cout << " |-------------------|" << endl;
> cout << " Enter your choice: ";
> cin >> choice;
> **cin.getline(clean, 2);


jeg kan nu heller ikke lige forstå den her ..... den burde man vel
egentlig at kunne slette....




det er ikke fordi jeg er den store guru.... men cin.getline bruges jo
bare til at hente til et array eller en char *, grunden til at han
bruger den i det her tilfælde er tilsyneladende, at han jo bruger fopen,
hvor han skal give en streng parameter med, for at specificere hvad det
er for en fil der ska krypteres. Derfor er det jo indlysende at det er
smartest at bruge denne funktion, da man med cin ikke kan specificere
max længde, jeg mener heller ikke man kan cin til et array....

håber det giver lidt mere mening ... jeg er ikke så god til at forklare
den slags!

m.v.h niels

---------------klip-------------------
> cout << endl;
> // Switch statement for choic

>

> switch(choice)
>
>
> {
> // Encode
> case 1:
> cout << " Enter the filename of file to encrypt: ";
> cin.getline(FName[0], 256, '\n'); // Get filename
> cout << " Enter the filename of the file to saved the encrypted file
> to: " << endl;
> cout << " ";
> cin.getline(FName[1], 256, '\n');
> cout << " Enter the key to encrypt the file(can't have spaces): ";
> cin >> key;//Get the key
> cin.getline(clean, 2);
> IFile = fopen(FName[0], "rb");//Open input file
> if(!(IFile))//Checking file existance
>
>


Jonas Meyer Rasmusse~ (27-10-2001)
Kommentar
Fra : Jonas Meyer Rasmusse~


Dato : 27-10-01 23:21

operator >> læser kun frem til næste white-space.
whitespace inkludere ' ', '\n' og sikkert flere.
getline læser _alt_ ind i bufferen givet indtil den givne delimiter.
dvs at
cin.getline( c, 256, '\n' );
læser ind fra cin, indtil der enten er indlæst 256 tegn eller der
kommer et '\n'.

grunden til at han kalder cin.getline( clear,2 );
er at han vil have fjernet den newline der ligger i bufferen
når du læser ind fra cin sluttes der jo af med enter..'\n'

eks:

string s;
cin >> s;
cout << s;
cin >> s;
cout << s;


Hvis du taster "abc abc" ind første gang, vil programmet
kun indlæse "abc" ind i s første gang, der kommer jo et whitespace efter..
og derfor er der stadig data i cin når du kalder den anden gang, og du vil
kun blive bedt om at taste
ind en gang.

Jonas



Bo Lorentsen (28-10-2001)
Kommentar
Fra : Bo Lorentsen


Dato : 28-10-01 07:59

In <Wd_B7.204$tI2.40284@news000.worldonline.dk>, Søren Badstue wrote:

> Jeg er lige startet på DTU, hvor vi bl.a. skal lære C++. Vi er nu nået
> til et projekt hvor vi skal kryptere et password, så jeg kiggede lidt på
> nettet (mest for sjov) for at finde ud af en måde at kryptere på.
Ganske fornuftigt, man kan lære meget af andre kode !

> choice: ";
> cin >> choice;
> **cin.getline(clean, 2);
Jeg vil gætte på at den fjerner CR og eller NL på en DOS/Windows platform,
prøv at se hvad "clean" indeholder !

Hvis du ikke får disse fjernet vil den næste indlæsning gå galt.

/BL

Søren Badstue (28-10-2001)
Kommentar
Fra : Søren Badstue


Dato : 28-10-01 11:38

Hejsa.

1.000 tak for alle svar.
Det hjalp meget på forståelsen.

--
Med venlig hilsen
Søren



Igor V. Rafienko (28-10-2001)
Kommentar
Fra : Igor V. Rafienko


Dato : 28-10-01 13:43

[ Søren Badstue ]

[ snip ]

> 1.000 tak for alle svar.
> Det hjalp meget på forståelsen.


En liten kommentar i ettertid -- du er mere tjent med å studere
skikkelig C++ kode. Vedkommende som skrev det du postet aner åpenbart
_ikke_ hvordan man skal bruke streams funksjonaliteten (da den riktige
framgangsmåten er 'ignore' og ikke 'getline'[*]). Attpåtil bruker
vedkommende char-arrays, noe som er _opplagt_ galt i den konteksten
oppgaven fremstår i.

Prøv å omskrive denne snutten slik at det begynner å ligne C++. Det
vil være en meget god øvelse.





ivr
[*] ta en titt selv på hva ignore og getline brukes til.
--
striving to become a programmer... very hungry...
will code for foo^H^H^H^H solar cells...

Søren Badstue (28-10-2001)
Kommentar
Fra : Søren Badstue


Dato : 28-10-01 14:06


Igor V. Rafienko <igorr@ifi.uio.no> skrev i en
nyhedsmeddelelse:xjvsnc4uea0.fsf_-_@heidrek.ifi.uio.no...
>
> En liten kommentar i ettertid -- du er mere tjent med å studere
> skikkelig C++ kode. Vedkommende som skrev det du postet aner åpenbart
> _ikke_ hvordan man skal bruke streams funksjonaliteten (da den riktige
> framgangsmåten er 'ignore' og ikke 'getline'[*]). Attpåtil bruker
> vedkommende char-arrays, noe som er _opplagt_ galt i den konteksten
> oppgaven fremstår i.
>
> Prøv å omskrive denne snutten slik at det begynner å ligne C++. Det
> vil være en meget god øvelse.
>

Okay. Det vil jeg da så prøve. Tak for rådet.

--
Søren



Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408925
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste