Funzione banale criptaggio [C]
Ragazzi, mi è stato chiesto un progetto, all'università, abbastanza banale per il criptaggio di un file di testo. Io ho fatto questo: mi potete dire dove è l'errore?
in pratica non appena avvio il programma è come se non mi trovasse EOF. Perchè?
void criptaggio(FILE* input_file){ FILE* cripted_file; int codificato; int i, j=0; int chr = 255; char inverted_ascii[256]={0}; if ((cripted_file = fopen("file_criptato.txt","w")) == NULL) { printf("errore: file file_criptato.txt non trovato!"); exit(-1); } //Creo il vettore col codice ASCII invertito for(i=0;i<256;i++){ while(j != (chr+1)){ inverted_ascii[i]=chr - j; printf("[%c]", inverted_ascii[i]); j++; break; } } while (!feof(input_file)){ chr = fgetc(input_file); codificato = inverted_ascii[chr]; fprintf(cripted_file,"%c",codificato); } }
in pratica non appena avvio il programma è come se non mi trovasse EOF. Perchè?
Risposte
Alcuni commenti:
[list=1][*:6ukngspu] È saggio non mescolare tab e spazi perché quando copi il tuo codice rischi che ci siano problemi nell'indentazione;[/*:m:6ukngspu]
[*:6ukngspu] Il C non richiede più da 10 anni di definire tutto all'inizio e non è una bella idea usare una variabile per più scopi. La variabile chr possiede due scopi, tra l'altro molto diversi: nel primo è la costante 255, nel seconda la variabile usata per caricare i caratteri. Usare due variabili locali, definite all'interno dei cicli, magari costanti, è una migliore idea. Nel caso della prima, probabilmente, scrivere direttamente 255 facilita la lettura.[/*:m:6ukngspu]
[*:6ukngspu] Dai per scontato che getc restituisca valori tra 0 e 255 ma non è detto, potresti avere valori negativi se il sistema usa signed char di default (o avere char di dimensione diversa nel caso di sistemi esotici). [/*:m:6ukngspu]
[*:6ukngspu] Dovresti separare meglio le componenti di debug da quelle non di debug. Per esempio usando i comandi del preprocessore #ifdef e #endif intorno ai vari printf.[/*:m:6ukngspu]
[*:6ukngspu] Riguardo a feof guarda questo e in particolar modo i suoi fix. Sinceramente di consiglio di spostare la lettura del carattere nel while.[/*:m:6ukngspu][/list:o:6ukngspu]
[list=1][*:6ukngspu] È saggio non mescolare tab e spazi perché quando copi il tuo codice rischi che ci siano problemi nell'indentazione;[/*:m:6ukngspu]
[*:6ukngspu] Il C non richiede più da 10 anni di definire tutto all'inizio e non è una bella idea usare una variabile per più scopi. La variabile chr possiede due scopi, tra l'altro molto diversi: nel primo è la costante 255, nel seconda la variabile usata per caricare i caratteri. Usare due variabili locali, definite all'interno dei cicli, magari costanti, è una migliore idea. Nel caso della prima, probabilmente, scrivere direttamente 255 facilita la lettura.[/*:m:6ukngspu]
[*:6ukngspu] Dai per scontato che getc restituisca valori tra 0 e 255 ma non è detto, potresti avere valori negativi se il sistema usa signed char di default (o avere char di dimensione diversa nel caso di sistemi esotici). [/*:m:6ukngspu]
[*:6ukngspu] Dovresti separare meglio le componenti di debug da quelle non di debug. Per esempio usando i comandi del preprocessore #ifdef e #endif intorno ai vari printf.[/*:m:6ukngspu]
[*:6ukngspu] Riguardo a feof guarda questo e in particolar modo i suoi fix. Sinceramente di consiglio di spostare la lettura del carattere nel while.[/*:m:6ukngspu][/list:o:6ukngspu]
for(i=0;i<256;i++){ while(j != (chr+1)){ inverted_ascii[i]=chr - j; printf("[%c]", inverted_ascii[i]); j++; break; } }
Per quale assurdo motivo in questo pezzo di codice c'è un break lasciato lì a pascolare?
Poi, vabè, magari dicci cosa ti restituisce in errore.
Quel codice è equivalente al seguente:
A parte questo problema non indifferente farei notare che sia discutibile e tremendamente inefficiente il fatto che carichi un singolo elemento per volta. Un problema potrebbe però essere nel fatto che questo tipo di criptazione scrive su file anche dei caratteri speciali che potrebbero rendere difficile l'uso di fputs e similari. Anche se si può probabilmente risolvere fissando 0 e 255. Comunque questo metodo crittografico è insicuro.
for(i=0;i<256;i++) { inverted_ascii[i] = 255 - i; printf("[%c]", inverted_ascii[i]); }anche se non sono sicuro il compilatore se ne accorga.
A parte questo problema non indifferente farei notare che sia discutibile e tremendamente inefficiente il fatto che carichi un singolo elemento per volta. Un problema potrebbe però essere nel fatto che questo tipo di criptazione scrive su file anche dei caratteri speciali che potrebbero rendere difficile l'uso di fputs e similari. Anche se si può probabilmente risolvere fissando 0 e 255. Comunque questo metodo crittografico è insicuro.
"fk16":
in pratica non appena avvio il programma è come se non mi trovasse EOF. Perchè?
Che intendi dire?
Comunque questo metodo crittografico è insicuro.
Beh, essendo per l'università, credo che sia uno di quei programmini assegnati giusto per far prendere confidenza con la materia.
In ogni caso quale sarebbe la "consegna"? Perchè io eviterei di rovesciare tutta la tabella ASCII per implementare l'Atbash.
Sinceramente penso sia un compito di informatica e non di crittografia. Quella era solo un piccolo commento, le mie vere critiche erano le altre. Continuando per le critiche si potrebbe anche dire che si poteva dividere la scrittura su file dalla parte crittografica implementando una funzione che cifrasse un array di char e una che caricasse stringhe da un file e le scrivesse su un altro convertite. Oltre che ovviamente l'inutilità di scrivere la tabella come hai ben detto tu.
Idea: anzichè ammattirsi con array vari basterebbe eseguire uno xor bit a bit tra il carattere ed il byte 0111111 (per l'ASCII) o il byte 1111111 (per l'ISO-8859).
Il problema però è questo: una parte dei caratteri stampabili, con una semplice inversione della tabella ASCII, verrebbero tramutati in caratteri non stampabili.
A meno che la consegna del compito non sia vincolante, io direi di crearti un array che non contenga tutti i caratteri ASCII, ma solo quelli stampabili e operare l'inversione su quello.
Per quanto riguarda la scrittura su file, io mi semplificherei la vita, visto che si tratta di scrivere un carattere alla volta: usa la funzione fputc (int c, FILE *stream).
Il problema però è questo: una parte dei caratteri stampabili, con una semplice inversione della tabella ASCII, verrebbero tramutati in caratteri non stampabili.
A meno che la consegna del compito non sia vincolante, io direi di crearti un array che non contenga tutti i caratteri ASCII, ma solo quelli stampabili e operare l'inversione su quello.
Per quanto riguarda la scrittura su file, io mi semplificherei la vita, visto che si tratta di scrivere un carattere alla volta: usa la funzione fputc (int c, FILE *stream).
Ragazzi vi ringrazio dell'aiuto, ma alla fine visto le problematiche del programmino che ho fatto, ho deciso di rifarlo in altro modo!!! Grazie lo stesso dell'aiuto.