Domanda

Non come in " non riesco a trovare la risposta su StackOverflow " ;, ma come in " non riesco a vedere cosa sto facendo di sbagliato ", grande differenza!

Comunque, il codice è allegato di seguito. Quello che fa è abbastanza semplice, prende in un file di testo creato dall'utente e ne sputa uno che è stato crittografato. In questo caso, l'utente dice quanti caratteri spazzatura mettere tra ciascun personaggio reale. (IE: se volessi crittografare la parola "Ciao" con 1 carattere spazzatura, sembrerebbe "9H (eal ~ l.o ")

Il mio problema è che per qualche motivo non legge correttamente il file di input. Sto usando la stessa configurazione per leggere nel file come avevo fatto in precedenza sulla decrittazione, ma questa volta sta leggendo i caratteri spazzatura e quando gli dico di output su file, lo stampa invece sullo schermo e sembra che non viene inserito nulla nel file di output (anche se viene creato, quindi ciò significa che ho fatto qualcosa correttamente, punto per me!

codice:

string start;
char choice;
char letter;
int x;
int y;
int z;
char c;
string filename;

while(start == "enc")
{
    x = 1;
    y = 1;
    cout << "How many garbage characters would you like between each correct character?: " ;
    cin >> z;
    cout << endl << "Please insert the name of the document you wish to encrypt, make sure you enter the name, and the file type (ie: filename.txt): " ;
    cin >> filename;
    ifstream infile(filename.c_str());
    ofstream outfile("encrypted.txt", ios::out);

    while(!infile.eof())
    {
        infile.get(letter); 
        while ((x - y) != z)         
        {
            outfile << putchar(33 + rand() % 94);
            x++;    
        }
        while((x - y) == z)
        {
            outfile << letter;
            y = 1;
            x = 1;
        }
    }
    outfile.close();
    cout << endl << "Encryption complete...please return to directory of program, a new file named encrypted.txt will be there." << endl;
    infile.close();
    cout << "Do you wish to try again? Please press y then enter if yes (case sensitive).";
    cin >> choice;

Quello che ho incollato sopra l'inizio del ciclo while sono le variabili di dichiarazione, questo fa parte di un codice molto più grande che non solo crittograferà, ma decifrerà anche, ho lasciato fuori la parte di decrittazione mentre funziona perfettamente, è questo parte sto avendo un problema con.

Grazie in anticipo per l'assistenza!

EDIT :: Sto usando Visual C ++ Express 2008, e mi fa capire che non ci sono errori, né avvisi.

MODIFICA IMPORTANTE Si scopre che è in uscita al file! Tuttavia, sta producendo numeri anziché caratteri ASCII, e sta anche producendo il carattere immondizia per la lettera che dovrebbe essere. Quando ritorna a " infile.get (lettera) " ;, non ottiene un nuovo personaggio. Quindi in questo momento sembra che i problemi siano due volte: 1) Stampa di numeri anziché di caratteri ASCII. 2) Usare la spazzatura al posto del personaggio reale che dovrebbe ottenere.

Domanda con risposta Scopri la seconda parte in " Important Edit " ... si scopre se si chiama qualcosa test.txt ... significa che in realtà viene chiamato test.txt.txt quando lo si digita in un programma C ++. Mostra solo i piccoli, piccoli e semplici dettagli che fanno impallidire qualsiasi programma. Grazie a George Shore. Il tuo commento sul file di input che si trova nella posizione sbagliata è ciò che mi ha dato l'idea di provare il nome effettivo degli articoli.

Grazie a tutti quelli che hanno aiutato con la risposta!

È stato utile?

Soluzione

Oltre alle risposte precedenti, credo che sia perché il file che desideri crittografare non viene trovato dal codice originale. È sicuro supporre che stai eseguendo il codice dall'IDE? In tal caso, il file che deve essere crittografato deve trovarsi nella stessa directory dell'origine.

Inoltre:

outfile << putchar(33 + rand() % 94);

sembra essere la fonte della tua spazzatura sullo schermo; la funzione 'putchar' echeggia sullo schermo mentre restituisce il valore intero di quel carattere. Ciò che accadrà è che quel numero verrà emesso nel file, al contrario del carattere.

Modifica quel blocco in qualcosa del tipo:

while ((x - y) != z)         
{
    c = (33 + rand() % 94);
    outfile << c;
    x++;
}

dovrebbe abilitare l'esecuzione del codice come desiderato.

Altri suggerimenti

Invece di farlo:

while (!infile.eof())
{
    infile.get(letter);
    if (infile.good())
    {

Fai questo:

while (infile.get(letter))
{

Questo è lo schema standard per la lettura di un file.
Ottiene un personaggio e il file risultante (che viene restituito da get) viene quindi verificato per vedere se è ancora buono convertendolo in bool.

La linea:

outfile << putchar(33 + rand() % 94);

Probabilmente dovrebbe essere:

outfile << static_cast<char>(33 + rant() % 94);

putchar () stampa sull'output standard. Ma il valore restituito (uguale all'input) va al file di output. Per fermarlo basta convertire il valore in char e inviarlo in outfile.

È necessario l'uso di ' y '? Mi sembra confuso e non necessario. Se lo stavo implementando, mi aspetterei di usare solo ' x ' e ' z '.

Inoltre, non sono sicuro della condizione ' while (! infile.eof ()) '; Pascal determina EOF in anticipo, ma C ++ può parlarti di EOF solo dopo aver tentato di leggi un personaggio . Tuttavia, ciò influirebbe solo sulla fine del file, non sul corpo principale del ciclo.

    while (!infile.eof())
    {
        infile.get(letter);
        if (infile.good())
        {
            for (int i = 0; i < z; i++)        
                outfile << putchar(33 + rand() % 94);
            outfile << letter;
        }
    }

(Codice non compilato!).

Inoltre, non utilizzarlo per motivi di sicurezza: potrebbe essere di aiuto, ma certamente non nasconderà le informazioni a determinati.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top