Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Codifica e Decodifica File Testo
Forum - C/C++ - Codifica e Decodifica File Testo

Avatar
u064241 (Normal User)
Newbie


Messaggi: 5
Iscritto: 28/06/2009

Segnala al moderatore
Postato alle 22:34
Giovedì, 02/09/2010
Salve a tutti
Ho fatto il seguente esercizio; passando da linea di comando:
mioprogramma.exe input.txt (C o D) K output.txt esegue la codifica o la decodifica di un file testo.
Rispettivamente C sta per codifica e D per decodifica, K è una costante intera che viene aggiunta al codice ascii. Mi sembra funzionare, ma perchè nell'output video mi inserisce un <null> (sia in C che in D) e nell'output testo ( solo in D) mi doppia l'ultimo carattere?
Ecco il codice:
Codice sorgente - presumibilmente C++

  1. /* Codifica e Decodifica */
  2.  
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <string.h>
  6. #include <ctype.h>
  7. #include <conio.h>
  8.  
  9. #define MAX 1000
  10. #define SPAZIO 32
  11.  
  12. typedef enum {FALSO,VERO} boolean;
  13.  
  14. char *codifica(char *infname,int k, char *outfname);
  15. char *decodifica(char *infname,int k, char *outfname);
  16.  
  17. int main(int argc, char **argv)
  18. {
  19.     system("cls");
  20.     printf("--------------------------\n");
  21.     printf(" Codifica e Decodifica    \n");
  22.     printf("--------------------------\n");
  23.  
  24.     if(argc<5)  // controllo argomenti
  25.     {
  26.         printf("\nErrore numero parametri !!\n");
  27.         printf("\nUso: %s"
  28.                " <input-file> <parametri [C or D]> <K> <output-file>\n\n",argv[0]);
  29.     }
  30.     else
  31.     {
  32.         printf("\n\nControllo parametri ed esecuzione\n\n");
  33.  
  34.         if ((strcmp(argv[2],"C"))==0)
  35.             printf("%s", codifica(argv[1],atoi(argv[3]),argv[4]));
  36.         else
  37.             printf("%s", decodifica(argv[1],atoi(argv[3]),argv[4]));
  38.     }
  39.     printf ("\nPremi un tasto per uscire . . .");
  40.     printf ("\n");
  41.     getch();
  42.     return 0;
  43. }
  44.  
  45. char *codifica(char *infname, int k, char *outfname)
  46. {
  47.     FILE *fin, *fout;
  48.     int esito=0;
  49.     int valore=0;
  50.     char s[MAX];
  51.     char c=0;
  52.     int i=0;
  53.     int n1=0;
  54.     int posizione=0;
  55.     boolean finito=FALSO;
  56.  
  57.     // CONTROLLO APERTURA E CREAZIONE FILE
  58.  
  59.     if ((fin=fopen(infname,"r"))==NULL)
  60.     {
  61.         fprintf (stderr,"\a\nErrore apertura %s\n",infname);
  62.         exit(1);
  63.     }
  64.  
  65.     if ((fout=fopen(outfname,"w"))==NULL)
  66.     {
  67.         fprintf (stderr,"\a\nErrore creazione %s\n",outfname);
  68.         exit(1);
  69.     }
  70.  
  71.     while (c != EOF)
  72.     {
  73.         c=getc(fin);
  74.         s[posizione]=c;
  75.         posizione++;
  76.  
  77.         for(; i<posizione && !finito; i++)
  78.         {
  79.             valore=s;
  80.             esito=isalpha(valore);
  81.  
  82.             if (esito != 0)
  83.             {
  84.                 if ((i==0)||(i%2==0))
  85.                 {
  86.                     n1=toascii(valore);
  87.                     fprintf (fout,"%d\n",n1+k);
  88.                     printf ("%d\n",n1+k);
  89.                 }
  90.                 if (i%2 !=0)
  91.                 {
  92.                     n1=toascii(valore);
  93.                     fprintf(fout,"%d\n",n1-k);
  94.                     printf ("%d\n",n1-k);
  95.                 }
  96.             }
  97.             if (s == ' ')
  98.             {
  99.                 n1=toascii(valore);
  100.                 fprintf (fout,"%d\n",n1);
  101.                 printf ("%d\n",n1);
  102.                 posizione++;
  103.             }
  104.         }
  105.         finito=FALSO;
  106.         i=posizione;
  107.     }
  108.  
  109.     fclose(fin);
  110.     fclose(fout);
  111.     printf ("\nOK!\n\n");
  112. }
  113.  
  114. char *decodifica(char *infname,int k, char *outfname)
  115. {
  116.     FILE *fin, *fout;
  117.     unsigned char s[MAX];
  118.     int i=0;
  119.  
  120.     // CONTROLLO APERTURA E CREAZIONE FILE
  121.  
  122.     if ((fin=fopen(infname,"r"))==NULL)
  123.     {
  124.         printf ("\nErrore apertura %s\n",infname);
  125.         exit(0);
  126.     }
  127.  
  128.     if ((fout=fopen(outfname,"w"))==NULL)
  129.     {
  130.         printf ("\nErrore creazione %s\n",outfname);
  131.         exit(0);
  132.     }
  133.     while (!feof(fin))  // leggo il file fino alla fine e lo inserisco nella stringa s
  134.     {
  135.         fscanf (fin,"%d", s);
  136.         i=0;
  137.  
  138.         if ((s==0)||(s%2==0) && s != SPAZIO)
  139.         {
  140.             fprintf (fout,"%c\n",s-k);
  141.             printf("%c\n",s-k);
  142.         }
  143.         if ((s%2 !=0) && (s != SPAZIO))
  144.         {
  145.             fprintf(fout,"%c\n",s+k);
  146.             printf("%c\n", s+k);
  147.         }
  148.         if (s ==SPAZIO)
  149.         {
  150.             printf("\n");
  151.             fprintf (fout,"\n");
  152.         }
  153.         i++;
  154.     }
  155.     fclose(fin);
  156.     fclose(fout);
  157.     printf ("\n\nOK!\n\n");
  158. }


Grazie a chi può aiutarmi e buona serata.

PM Quote
Avatar
()
Newbie


Messaggi:
Iscritto:

Segnala al moderatore
Postato alle 16:17
Venerdì, 03/09/2010
mmm...curiosità xD: perchè hai dichiarato le funzioni con char* se non restituiscono un puntatore a char?

PM Quote
Avatar
u064241 (Normal User)
Newbie


Messaggi: 5
Iscritto: 28/06/2009

Segnala al moderatore
Postato alle 0:06
Sabato, 04/09/2010
Si è vero, ma anche se metto void il risultato è lo stesso. Qualche suggerimento?

PM Quote