Visualizzazione dei risultati da 1 a 10 su 10

Discussione: [C++] Problema di File

  1. #1

    Problema di File

    Salve a tutti, sono nuovo nel forum ma programmo da parecchi anni. Dunque, ultimamente mi sono dedicato molto alla programmazione PHP, scoprendo la passione per i CMS.
    Ieri mi é girato di scrivere un programmino in c++ console che codificasse un file secondo l'algoritmo ONE TIME PAD (algoritmo assolutamente sicuro al 100%, unico svantaggio la chiave deve essere lunga tanto quanto lo é il messaggio da criptare).
    Posto il sorgente:
    codice:
    #include <iostream.h>
    #include <stdlib.h>
    #include <string.h>
    #include <fstream.h>
    
    using namespace std;
    int choose;
    char path_file_to_encode[100];
    char path_file_to_decode[100];
    char path_file_key[100];
    fstream file_to_encode;
    fstream file_to_decode;
    ifstream file_key;
    
    void encode();
    void decode();
    
    int main(int argc, char *argv[])
    {
        while(1)
        {
        cout << "One Time Pad Encoder Decoder v 0.1\n";
        cout << "1. Encode\n";
        cout << "2. Decode\n";
        cout << "3. Exit\n";
        cout << "Choose: ";
        cin >> choose;
        if(choose==1)
        {
              encode();                                      
        }
        else if(choose==2)
        {
              decode();
        }
        else break;
        }
        return EXIT_SUCCESS;
    }
    
    void encode()
    {
         char byte0, byte1;
         cout << "File to encode: ";
         cin >> path_file_to_encode;
         cout << "File key: ";
         cin >> path_file_key;
         cout << "File encoded: ";
         cin >> path_file_to_decode;
         file_to_encode.open(path_file_to_encode, ios::in );
         file_key.open(path_file_key, ios::in );
         file_to_decode.open(path_file_to_decode, ios::out );
         while (file_to_encode.get(byte0))
         {
               file_key.get(byte1);
               byte0 += byte1;
               file_to_decode.put(byte0);
         }
         file_to_encode.close();
         file_key.close();
         file_to_decode.close();
         cout << "File encoded correctly!\n";
    }
    
    void decode()
    {
         char byte0, byte1;
         cout << "File to decode: ";
         cin >> path_file_to_decode;
         cout << "File key: ";
         cin >> path_file_key;
         cout << "File decoded: ";
         cin >> path_file_to_encode;
         file_to_encode.open(path_file_to_encode, ios::out );
         file_key.open(path_file_key, ios::in );
         file_to_decode.open(path_file_to_decode, ios::in );
         while (file_to_decode.get(byte0))
         {
               file_key.get(byte1);
               byte0 -= byte1;
               file_to_encode.put(byte0);
         }
         file_to_encode.close();
         file_key.close();
         file_to_decode.close();
         cout << "File decoded correctly!\n";
    }
    Però ho un problema, grosso, appena cerco di decriptare il file che ho appena criptato il contenuto del file decifrato é vuoto... 0Kb, ho provato pure a inserire ios::binary durante l'open ma nulla di nuovo.... Insomma la criptazione funziona, o meglio il file criptato si riempie di simboli strani (come è giusto che sia), ma non capisco perché mentro lo decifro.... il file che mi si crea é totalmente vuoto. Ho steso il sorgene in modo che sia abbastanza comprensibile anche se ho dimenticato i commenti. Uso il compilatore Dev C++, ho provato quello della microsoft (visual c++ 2008) ma non mi ci trovo per nulla. Qualcuno sa dirmi dove sta l'errore? Grazie

  2. #2
    Perchè lo apri in modalità ios:ut, che apre e cancella il contenuto del file, spostando il puntatore a inizio file.

  3. #3
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328

    Moderazione

    Il linguaggio va sempre indicato nel titolo della discussione (come da regolamento).
    Il codice non va postato all'interno dei tag QUOTE, ma all'interno dei tag CODE, altrimenti perde indentazione e formattazione.

    Il titolo l'ho sistemato io.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  4. #4
    Originariamente inviato da menphisx
    Perchè lo apri in modalità ios:ut, che apre e cancella il contenuto del file, spostando il puntatore a inizio file.
    E ma scusa come lo dovrei aprire? Ho usato lo stesso sistema anche per l'altra funzione, quella che cripta. Inoltre per risparmiare variabili file ne ho tirate in gioco solo 3
    nella criptazione:
    - file_to_encode: file da criptare
    - file_key: file chiave
    - file_to_decode: file criptato
    nella decriptazione
    -file_to_encode: file decriptato
    -file_key: file chiave
    -file_to_decode: file da decriptare

    forse ti eri confuso in queste cose..... fammi/fatemi sapere

  5. #5

    Sorgente Commentato

    Scusate ragazzi per l'UP ma ho appena sistemato il sorgente cosi che possa essere letto più facilmente:
    codice:
    #include <iostream>
    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
    #include <fstream>
    
    using namespace std;
    char choose[2];
    char path_file_to_encode[100];
    char path_file_to_decode[100];
    char path_file_key[100];
    fstream file_to_encode; // Input in encode, Output in decode
    fstream file_to_decode; // Output in encode, Input in decode
    ifstream file_key; // Input in encode and decode
    
    void encode();
    void decode();
    void info();
    
    int main(int argc, char *argv[])
    {
        while(1)
        {
            system("CLS");
            cout << "One Time Pad Encoder Decoder v 0.1\n";
            cout << "1. Encode\n";
            cout << "2. Decode\n";
            cout << "3. Info\n";
            cout << "Other. Exit\n";
            cout << "Choose: ";
            cin >> choose;
            if(!strcmp(choose,"1"))
            {
                  encode();                                      
            }
            else if(!strcmp(choose,"2"))
            {
                  decode();
            }
            else if(!strcmp(choose,"3"))
            {
                  info();
            }
            else break;
        }
        return EXIT_SUCCESS;
    }
    
    void encode()
    {
         char byte0, byte1;
         // Path del file da codificare
         cout << "File to encode: ";
         cin >> path_file_to_encode;
         // Path del file chiave
         cout << "File key: ";
         cin >> path_file_key;
         // Path del file codificato (fine procedura)
         cout << "File encoded: ";
         cin >> path_file_to_decode;
         // Apro i file
         file_to_encode.open(path_file_to_encode, ios::in | ios::binary);
         file_key.open(path_file_key, ios::in | ios::binary);
         file_to_decode.open(path_file_to_decode, ios::out | ios::binary);
         // Processo di codifica
         while (file_to_encode.get(byte0))
         {
               file_key.get(byte1);
               byte0 += byte1;
               file_to_decode.put(byte0);
         }
         // Chiudo i file
         file_to_encode.close();
         file_key.close();
         file_to_decode.close();
         cout << "File encoded correctly!\n";
         system("PAUSE");
    }
    
    void decode()
    {
         char byte0, byte1;
         // Path del file da decodificare
         cout << "File to decode: ";
         cin >> path_file_to_decode;
         // Path del file chiave
         cout << "File key: ";
         cin >> path_file_key;
         // Path del file decodificato (fine procedura)
         cout << "File decoded: ";
         cin >> path_file_to_encode;
         // Apro i file
         file_to_encode.open(path_file_to_encode, ios::out | ios::binary);
         file_key.open(path_file_key, ios::in | ios::binary);
         file_to_decode.open(path_file_to_decode, ios::in | ios::binary);
         // Processo di decodifica
         while (file_to_decode.get(byte0))
         {
               file_key.get(byte1);
               byte0 -= byte1;
               file_to_encode.put(byte0);
         }
         // Chiudo i file
         file_to_encode.close();
         file_key.close();
         file_to_decode.close();
         cout << "File decoded correctly!\n";
         system("PAUSE");
    }
    
    void info()
    {
         // Output Informazioni
         cout << "- Be sure that key file is longer or equal to decode/encode file\n";
         cout << "- Created by DesertBoyOfSun http://ottastyle.com\n";
         system("PAUSE");    
    }

  6. #6
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328

    Moderazione

    Attenzione: hai cliccato su "Nuovo" anzichè entrare nella discussione e cliccare su "Rispondi".

    Ho riunito le discussioni.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  7. #7

    Re: Moderazione

    Originariamente inviato da LeleFT
    Attenzione: hai cliccato su "Nuovo" anzichè entrare nella discussione e cliccare su "Rispondi".

    Ho riunito le discussioni.


    Ciao.
    Grazie sorry!

  8. #8
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,481
    Ho solamente compilato ed eseguito il codice e non ho avuto i problemi di cui parli.

    Ho fatto l'encoding con

    file.txt
    key.txt
    file2.txt

    e il decoding con

    file2.txt
    key.txt
    file3.txt

    e mi pare sia andato tutto bene.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  9. #9
    Dunque ti capisco... forse perché hai chiuso il programma dopo la codifica e lo hai riaperto per la decodifica? Quando faccio cosi mi funziona bene... ma se tento di decoficarlo una volta codificato mi da un file vuoto...

  10. #10
    Salve ragazzi... allora eccovi il sorgente definitivo:

    codice:
    #include <iostream>
    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
    #include <fstream>
    
    using namespace std;
    char choose[2];
    char path_file_to_encode[100];
    char path_file_to_decode[100];
    char path_file_encoded[100];
    char path_file_decoded[100];
    char path_file_key[100];
    ifstream file_to_encode; // Input in encode
    ifstream file_to_decode; // Input in decode
    ofstream file_encoded; // Output in encode
    ofstream file_decoded; // Output in decode
    ifstream file_key; // Input in encode and decode
    
    void encode();
    void decode();
    void info();
    
    int main(int argc, char *argv[])
    {
        while(1)
        {
            system("CLS");
            cout << "\nOne Time Pad Encoder Decoder v 0.2\n\n";
            cout << "1. Encode\n";
            cout << "2. Decode\n";
            cout << "3. Info\n";
            cout << "Other. Exit\n";
            cout << "Choose: ";
            cin >> choose;
            if(!strcmp(choose,"1"))
            {
                  encode();                                      
            }
            else if(!strcmp(choose,"2"))
            {
                  decode();
            }
            else if(!strcmp(choose,"3"))
            {
                  info();
            }
            else break;
        }
        return EXIT_SUCCESS;
    }
    
    void encode()
    {
         system("CLS");
         int error = 0;
         char byte0, byte1;
         cout << "\n-- Encoding --\n\n";
         // Path del file da codificare
         cout << "File to encode: ";
         cin >> path_file_to_encode;
         // Path del file chiave
         cout << "File key: ";
         cin >> path_file_key;
         // Path del file codificato (fine procedura)
         cout << "File encoded: ";
         cin >> path_file_encoded;
         // Apro i file
         file_to_encode.open(path_file_to_encode, ios::in | ios::binary);
         if(!file_to_decode)
         {
              cout << "Error opening " << file_to_encode << "\n"; 
              error = 1;                
         }
         file_key.open(path_file_key, ios::in | ios::binary);
         if(!file_key)
         {
              cout << "Error opening " << file_key << "\n"; 
              error = 1;                
         }
         file_encoded.open(path_file_encoded, ios::out | ios::binary);
         if(!file_encoded)
         {
              cout << "Error opening " << file_encoded << "\n"; 
              error = 1;                
         }
         if(!error)
         {
             cout << "Encoding in progress... ";
             // Processo di codifica
             while (file_to_encode.get(byte0))
             {
                   file_key.get(byte1);
                   byte0 += byte1;
                   file_encoded.put(byte0);
             }
             // Chiudo i file
             file_to_encode.close();
             file_key.close();
             file_encoded.close();
             cout << "File encoded correctly!\n";
         }
         else
         {
              cout << "Error in encoding! Check your files path or integrity\n";     
         }
         cout << "\n";
         system("PAUSE");
    }
    
    void decode()
    {
         system("CLS");
         int error = 0;
         char byte0, byte1;
         cout << "\n-- Decoding --\n\n";
         // Path del file da decodificare
         cout << "File to decode: ";
         cin >> path_file_to_decode;
         // Path del file chiave
         cout << "File key: ";
         cin >> path_file_key;
         // Path del file decodificato (fine procedura)
         cout << "File decoded: ";
         cin >> path_file_decoded;
         // Apro i file
         file_to_decode.open(path_file_to_decode, ios::in | ios::binary );
         if(!file_to_decode)
         {
              cout << "Error opening " << file_to_decode << "\n"; 
              error = 1;                
         }
         file_key.open(path_file_key, ios::in | ios::binary);
         if(!file_key)
         {
              cout << "Error opening " << file_key << "\n";
              error = 1;                 
         }
         file_decoded.open(path_file_decoded, ios::out | ios::binary);
         if(!file_decoded)
         {
              cout << "Error opening " << file_decoded << "\n";      
              error = 1;           
         }
         if(!error)
         {
             cout << "Decoding in progress... ";
             // Processo di decodifica
             while (file_to_decode.get(byte0))
             {
                   file_key.get(byte1);
                   byte0 -= byte1;
                   file_decoded.put(byte0);
             }
             // Chiudo i file
             file_to_encode.close();
             file_key.close();
             file_decoded.close();
             cout << "File decoded correctly!\n";
         }
         else
         {
             cout << "Error in decoding! Check your files path or integrity\n";    
         }
         cout << "\n";
         system("PAUSE");
    }
    
    void info()
    {
         system("CLS");
         // Output Informazioni
         cout << "\n-- Info --\n\n";
         cout << "- Be sure that key file is longer or equal to decode/encode file\n";
         cout << "- Created by DesertBoyOfSun http://ottastyle.com\n";
         system("PAUSE");    
    }
    Dunque, ora funziona senza nessun problema, il programma fa il suo mestiere anche se ho dovuto apportare una modifica che prevede 2 variabili FILE in più:
    ho dovuto creare 3 file per ogni tipo di funzione (la key rimane l'unica in comune).

    La mia diagnosi é che la funzione .close() associata allo stream di file non funzionasse...infatti ho appurato che il file nonostante venisse chiuso, rimaneva sempre aperto nella stessa modalità iniziale (ios::in) e cosi l'ouput non funzionava... qualcuno sa dirmi perché il .close non funziona?

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2026 vBulletin Solutions, Inc. All rights reserved.