comparazione file

Moderatore: Sofy

comparazione file

Messaggioda ali7.p » gio lug 06, 2006 3:57 pm

Help me please!!

Devo scrivere un prgramma C che accetta come parametri di ingresso due file di testo e restituisce in uscita la copia delle righe del secondo file che differiscono dalle corrispondenti righe del primo indicando per ciascuna di esse il numero di riga

... almeno datemi qualche suggerimento...
ali7.p
 
Messaggi: 4
Iscritto il: gio lug 06, 2006 3:56 pm

Messaggioda Sofy » gio lug 06, 2006 5:32 pm

Ciao!
Scorri le righe del file e copiale in due stringhe ( fgets(stringa) ) per il confronto, caratterexcarattere per ogni riga, e tieni memoria delle righe con un contatore...potresti visualizzare la stringa ed il contatore ad ogni fine ciclo!
...può bastare?...spero di essere stata chiara! :)
Sofy
 
Messaggi: 1
Iscritto il: gio lug 06, 2006 5:20 pm

Re: comparazione file

Messaggioda matteo » gio lug 06, 2006 5:55 pm

ali7.p ha scritto:restituisce in uscita la copia delle righe del secondo file che differiscono dalle corrispondenti righe del primo indicando per ciascuna di esse il numero di riga

Il problema è ancora più difficile di quanto l'hai descritto.
In caso i due file abbiano lo stesso numero di righe, ed in caso le righe siano diverse in quanto a caratteri, ma nella stessa posizione nei due file, allora il consiglio di sofia è sufficiente.
Ma un caso molto comune non è quello che un file ha una riga cambiata, quanto piuttosto che nel file è stata aggiunta o rimossa una o più righe in diverse parti del file e tutt'altre righe in file diversi.
p.e.:
file1:
a
b
1
2
c
d
e
f
file2:
a
b
d
e
1
f
g
output tipico del programma:
3,5d2
< 1
< 2
< c
7a5
> 1
8a7
> g

... almeno datemi qualche suggerimento...

si. Installa linux ed utilizza il comando 'diff' :o
oppure prendi i sorgenti del comando 'diff' e fai il porting :D

Matteo
matteo
 
Messaggi: 327
Iscritto il: ven mar 17, 2006 10:22 am

Messaggioda ali7.p » ven lug 07, 2006 9:45 pm

ce l'ho unix... ma mi serve un programma in C, no un comando di shell...
ali7.p
 
Messaggi: 4
Iscritto il: gio lug 06, 2006 3:56 pm

Messaggioda Michele » ven lug 07, 2006 10:18 pm

forse ti potrebbe essere d'aiuto il codice sorgente in c del comando diff che trovi qui!
Michele
 
Messaggi: 308
Iscritto il: ven mar 17, 2006 2:14 am

Messaggioda LuX » sab lug 08, 2006 3:20 am

Michele ha scritto:forse ti potrebbe essere d'aiuto il codice sorgente in c del comando diff che trovi qui!


Ehmm... in quei file ci sono solo i binari (sigh)

Per fortuna c'è il progetto GNU che ci vien in aiuto:
http://ftp.gnu.org/gnu/diffutils/

Enjoy ;)
LuX
LuX
 
Messaggi: 14
Iscritto il: mar giu 27, 2006 11:33 pm

Messaggioda Michele » sab lug 08, 2006 9:27 am

ops!!!
ho sbagliato link da prendere da google...:P
Michele
 
Messaggi: 308
Iscritto il: ven mar 17, 2006 2:14 am

Messaggioda matteo » sab lug 08, 2006 11:30 am

ali7.p ha scritto:ce l'ho unix... ma mi serve un programma in C, no un comando di shell...

eheh, era una battuta...
comunque nulla toglie che da un programma in C puoi fare le chiamate distema e lanciare un comando esterno.

Matteo
matteo
 
Messaggi: 327
Iscritto il: ven mar 17, 2006 10:22 am

Messaggioda ali7.p » mar lug 11, 2006 5:41 pm

io ho buttato giù questo... ma c'è qualcosa che non va... :cry:
mi aiutate a capire cosa?

Codice: Seleziona tutto
#include <stdio.h>
#include<string.h>


char array1[MAX_DIM];
char array2[MAX_DIM];
char aux1[MAX_DIM];
char aux2[MAX_DIM];

unsigned int contatoreRighe=1;
unsigned int pos1=0;
unsigned int pos2=0;
unsigned int i;


int main (int argc, char *argv[]) {
   
   if (argc != 3) {
      printf("Parametri non validi - La sintassi corretta e'\n\n"
      "%s file_1 file_2\n", argv[0]);
      exit(1);
   }
   
   FILE *fp;
   fp=fopen(argv[1],"r");
   if(fp==NULL) {
        printf("ERRORE nell'accesso ai dati");
        exit(1);
   }

   FILE *fp1;   
   fp1=fopen(argv[2],"r");
   if(fp1==NULL) {
        printf("ERRORE nell'accesso ai dati");
        exit(0);
   }


   while ((array[pos1])&&(array2[pos2])) {
         for (i=0;((array1[pos1]!=newline)&&(array1[pos1]));pos1++,i++)
              aux1[i]=array1[pos1];
         aux1[i]='\0'; // chiude la stringa copiata carattere per carattere
         for (i=0;((array2[pos2]!=newline)&&(array2[pos2]));pos2++,i++)
              aux2[i]=array2[pos2];
         aux2[i]='0';

         if (strcmp(aux1,aux2)!=0)
              printf("\nRiga numero %u: %s\n", contatoreRighe,aux2);
         
         contatoreRighe++;
         if (array1[pos1])    // incrementa indice array solo se non è alla fine
                 pos1++;
         if (array2[pos2])         
                 pos2++;
   }
}
ali7.p
 
Messaggi: 4
Iscritto il: gio lug 06, 2006 3:56 pm

Messaggioda matteo » mar lug 11, 2006 10:43 pm

ali7.p ha scritto:io ho buttato giù questo... ma c'è qualcosa che non va... :cry:
mi aiutate a capire cosa?

certo che dicendo "qualcosa non va" e non dire cosa, senza poi dare una minima spiegazione del codice, non ci aiuta di certo a vedere cosa non va.

Comunque l'ho provato a compilare e sono usciti un po' di errori di sintassi:

Codice: Seleziona tutto
$ gcc diff.c
diff.c:5: error: `MAX_DIM' undeclared here (not in a function)

è un po' difficile fargli digerire char array1[MAX_DIM]; senza definire MAX_DIM (con una define)
Codice: Seleziona tutto
diff.c: In function `main':
diff.c:39: error: `array' undeclared (first use in this function)
diff.c:39: error: (Each undeclared identifier is reported only once
diff.c:39: error: for each function it appears in.)

avrai spagiato a scrivere array anzichè array1
Codice: Seleziona tutto
diff.c:40: error: `newline' undeclared (first use in this function)

e che è newline?
[cite](array1[pos1]!=newline)&&(array1[pos1])
[/cite]
infine per
Codice: Seleziona tutto
diff.c: At top level:
diff.c:5: error: storage size of `array1' isn't known
diff.c:6: error: storage size of `array2' isn't known
diff.c:7: error: storage size of `aux1' isn't known
diff.c:8: error: storage size of `aux2' isn't known

v.sopra

Risolvi gli errori sintattici, poi possiamo cominciare a discutere sulla logica di funzionamento (che non ho analizzato a fondo)

Matteo
matteo
 
Messaggi: 327
Iscritto il: ven mar 17, 2006 10:22 am

Messaggioda ali7.p » gio lug 13, 2006 9:18 am

so anch'io che dà quelli errori... ma non so da dove partire per risolverli...
La logica di funzionameto... io ho provato afare come mji avevate suggerito voi...

matteo ha scritto:che è newline?


newline non + il codice di terminazione riga in UNIX? io volevo intenbdere quello...
ali7.p
 
Messaggi: 4
Iscritto il: gio lug 06, 2006 3:56 pm

Messaggioda matteo » gio lug 13, 2006 10:04 am

ali7.p ha scritto:so anch'io che dà quelli errori... ma non so da dove partire per risolverli...

solitamente quando si posta su forum un codice, lo si manda privo di errori sintattici o, se il problema è la sintassi, si specifica che il problema è la sintassi.
Comunque aggiungi all'inizio
#define MAX_DIM 10
anche se il valore è relativo a quello che vuoi fare con quegli array (che non si è capito), modifica 'array' in 'array1' nella riga 39
l'indicatore di newline è '\n' o forse ti serve quello di fine stringa '\0' se tratti l'array come tale, o forse, con tutt'altra sintassi, EOL (end of line) se lavori su un file.
La logica di funzionameto... io ho provato afare come mji avevate suggerito voi...

beh, sarebbe il caso che la spieghi più dettagliatamente come l'hai implementata, visto che le nostre erano solo linee guida.
In particolare non mi torna la relazione tra gli array e il file, fisto che questi ultimi li apri ma non li usi da nessuna parte e utilizzi
while ((array1[pos1])&&(array2[pos2])) {
senza definire il contenuto di array1/2 da nessuna parte.

spiegaci bene che vuoi fare in dettaglio.

Matteo
matteo
 
Messaggi: 327
Iscritto il: ven mar 17, 2006 10:22 am


Torna a Programmazione C

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite

cron