Oppure

Loading
02/09/10 20:34
u064241
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:
/* Codifica e Decodifica */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <conio.h>

#define MAX 1000
#define SPAZIO 32

typedef enum {FALSO,VERO} boolean;

char *codifica(char *infname,int k, char *outfname);
char *decodifica(char *infname,int k, char *outfname);

int main(int argc, char **argv)
{
    system("cls");
    printf("--------------------------\n");
    printf(" Codifica e Decodifica    \n");
    printf("--------------------------\n");

    if(argc<5)  // controllo argomenti
    {
        printf("\nErrore numero parametri !!\n");
        printf("\nUso: %s"
               " <input-file> <parametri [C or D]> <K> <output-file>\n\n",argv[0]);
    }
    else
    {
        printf("\n\nControllo parametri ed esecuzione\n\n");

        if ((strcmp(argv[2],"C"))==0)
            printf("%s", codifica(argv[1],atoi(argv[3]),argv[4]));
        else
            printf("%s", decodifica(argv[1],atoi(argv[3]),argv[4]));
    }
    printf ("\nPremi un tasto per uscire . . .");
    printf ("\n");
    getch();
    return 0;
}

char *codifica(char *infname, int k, char *outfname)
{
    FILE *fin, *fout;
    int esito=0;
    int valore=0;
    char s[MAX];
    char c=0;
    int i=0;
    int n1=0;
    int posizione=0;
    boolean finito=FALSO;

    // CONTROLLO APERTURA E CREAZIONE FILE

    if ((fin=fopen(infname,"r"))==NULL)
    {
        fprintf (stderr,"\a\nErrore apertura %s\n",infname);
        exit(1);
    }

    if ((fout=fopen(outfname,"w"))==NULL)
    {
        fprintf (stderr,"\a\nErrore creazione %s\n",outfname);
        exit(1);
    }

    while (c != EOF)
    {
        c=getc(fin);
        s[posizione]=c;
        posizione++;

        for(; i<posizione && !finito; i++)
        {
            valore=s;
            esito=isalpha(valore);

            if (esito != 0)
            {
                if ((i==0)||(i%2==0))
                {
                    n1=toascii(valore);
                    fprintf (fout,"%d\n",n1+k);
                    printf ("%d\n",n1+k);
                }
                if (i%2 !=0)
                {
                    n1=toascii(valore);
                    fprintf(fout,"%d\n",n1-k);
                    printf ("%d\n",n1-k);
                }
            }
            if (s == ' ')
            {
                n1=toascii(valore);
                fprintf (fout,"%d\n",n1);
                printf ("%d\n",n1);
                posizione++;
            }
        }
        finito=FALSO;
        i=posizione;
    }

    fclose(fin);
    fclose(fout);
    printf ("\nOK!\n\n");
}

char *decodifica(char *infname,int k, char *outfname)
{
    FILE *fin, *fout;
    unsigned char s[MAX];
    int i=0;

    // CONTROLLO APERTURA E CREAZIONE FILE

    if ((fin=fopen(infname,"r"))==NULL)
    {
        printf ("\nErrore apertura %s\n",infname);
        exit(0);
    }

    if ((fout=fopen(outfname,"w"))==NULL)
    {
        printf ("\nErrore creazione %s\n",outfname);
        exit(0);
    }
    while (!feof(fin))  // leggo il file fino alla fine e lo inserisco nella stringa s
    {
        fscanf (fin,"%d", s);
        i=0;

        if ((s==0)||(s%2==0) && s != SPAZIO)
        {
            fprintf (fout,"%c\n",s-k);
            printf("%c\n",s-k);
        }
        if ((s%2 !=0) && (s != SPAZIO))
        {
            fprintf(fout,"%c\n",s+k);
            printf("%c\n", s+k);
        }
        if (s ==SPAZIO)
        {
            printf("\n");
            fprintf (fout,"\n");
        }
        i++;
    }
    fclose(fin);
    fclose(fout);
    printf ("\n\nOK!\n\n");
}

Grazie a chi può aiutarmi e buona serata.
aaa
03/09/10 14:17
mmm...curiosità xD: perchè hai dichiarato le funzioni con char* se non restituiscono un puntatore a char?
03/09/10 22:06
u064241
Si è vero, ma anche se metto void il risultato è lo stesso. Qualche suggerimento?
aaa