View Full Version : [C] comparazione file di testo
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...
trallallero
06-07-2006, 15:58
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...
scusa ma gli esami/esercizi vengono dati per verificare che lo studente
abbia capito. Non penso che tu sia entrata/o a scuola e ti abbiano
dato un esercizio da fare senza spiegarti prima come risolverlo ;)
Almeno fai vedere che sei capace di iniziarlo il programma ...
sai come si apre un file ? sai come si legge una riga del file aperto ?
scusa ma gli esami/esercizi vengono dati per verificare che lo studente
abbia capito. Non penso che tu sia entrata/o a scuola e ti abbiano
dato un esercizio da fare senza spiegarti prima come risolverlo ;)
Almeno fai vedere che sei capace di iniziarlo il programma ...
sai come si apre un file ? sai come si legge una riga del file aperto ?
la cosa piu importante, SAI confrontare le stringe :P
trallallero
06-07-2006, 16:37
la cosa piu importante, SAI confrontare le stringe :P
'azz ! gli avranno insegnato la strcmp dai :eek:
ali7.p, non ti sto prendendo in giro, se vuoi imparare a programmare
devi imparare ad usare la tua testa, fare tanti errori e soparttutto capire.
Se ricevi la pappa pronta non ci riuscirai mai ;)
'azz ! gli avranno insegnato la strcmp dai :eek:
ali7.p, non ti sto prendendo in giro, se vuoi imparare a programmare
devi imparare ad usare la tua testa, fare tanti errori e soparttutto capire.
Se ricevi la pappa pronta non ci riuscirai mai ;)
saggio :fagiano:
e non cercare su google il codice prefatto, facci vedere cosa sai fare e poi ti aiutiamo :) ovviamente non tutti sono dei geni all'inizio ma con un po di volontà lo diventerai.
'azz ! gli avranno insegnato la strcmp dai :eek:
ali7.p, non ti sto prendendo in giro, se vuoi imparare a programmare
devi imparare ad usare la tua testa, fare tanti errori e soparttutto capire.
Se ricevi la pappa pronta non ci riuscirai mai ;)
la risposta esatta per ogni persona che posta con un template tipo questo: devo fare questo programma, aiuto:voglio il codice.
voi avete ragione... ma ci sonoa nche altri ocntorni...
cmq...
Prendo da argc i due parametri
Li apro con fopen
Scorro le righe del file e le copio in due stringhe con fgets per il confronto
tiengo memoria delle righe con un contatore
alla fine di ogni ciclo visualizzo la stringa se diversa) e il contatore
la teoria la so... la pratica no...
voi avete ragione... ma ci sonoa nche altri ocntorni...
cmq...
Prendo da argc i due parametri
Li apro con fopen
Scorro le righe del file e le copio in due stringhe con fgets per il confronto
tiengo memoria delle righe con un contatore
alla fine di ogni ciclo visualizzo la stringa se diversa) e il contatore
la teoria la so... la pratica no...
ok, il procedimento è quello cosa nn ti è chiaro?
prova a scrivere qualche riga di codice, e poi posta se hai problemi
la teoria la so... la pratica no...
si vede che hai studiato troppo e messo in pratica troppo poco.. :fagiano:
#include <stdio.h>
#include<string.h>
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);
}
char s1[] = fgetc(&fp);
char s2[] = fgetc(&fp1);
strcmp(s1, s2);
[...]
}
con la fgetc ottieni un carattere, prova con la fgets
controlla anche il modo in cui hai definito le stringhe.
sarebbe meglio definire prima due array di caratteri dando anche una dimensione e poi riempirli...
così dichiari solo un puntatore, non una stringa.
tra l'altro in ansi c tutte le variabili vanno dichiarate prima di iniziare ad eseguire le operazioni
char s1[] = fgetc(&fp);
char s2[] = fgetc(&fp1);
devi usare fgets e ad ogni modo la sintassi è errata. Stai scrivendo in c, quindi le varaibili le dichiari all'inizio.
char s1[MAX_SIZE];
char s2[MAX_SIZE];
...
fgets(s1, MAX_SIZE, fp);
fgets(s2, MAX_SIZE, fp1);
INoltre devi testare il valore di ritorno dello strcmp, messo così non serve a nulla
Black imp
11-07-2006, 03:41
col termine 'righe' dovrebbe intendere stringhe di caratteri separate da invio. allora una possibilità è quella di leggere prima tutti e due i file, piazzarli in due array diversi - devi allocare la memoria per avere lo spazio, quindi o dichiari direttamente due array con tanto di dimensione, o usi due puntatori e fai una calloc basandoti sulla dimensione dei file e lasciando lo spazio per '\0'; poi apri un ciclo - o while, con un unsigned int che viene inizializzato a 1 prima e incrementato per ogni riga, o for - che termina quando sei arrivato alla fine di almeno uno dei due array. Prima inizializzi anche due var unsigned int che sono quelle che tengono traccia del carattere che sei arrivato a leggere nei due array principali.All'interno apri un altro ciclo che legge carattere per carattere dall'array memorizzato, finchè non trovi un carattere invio - il codice ascii te lo dice gentilmente qualcun altro perchè al momento non ricordo se è l'11 o qualcos'altro - e memorizzi la riga letta in un altro array con dimensioni che vuoi e che bastino a contenere una riga - al massimo lo fai grande quanto quelli principali -. stessa cosa per l'altro array principale. poi fai il confronto tra queste due righe con una strcmp - siamo sempre dentro il ciclo principale. se la strcmp dice che sono diverse stampi la seconda e l'int che stai incrementando per ogni ciclo; ricordati che se sei partito da 1 stamperai lo stesso valore se invece sei partito da zero stamperai quel valore +1. quindi incrementi questa variabile e il ciclo ricomincia.
morale
char array1[MAX_DIM];
char array2[MAX_DIM];
char aux1[MAX_DIM];
char aux2[MAX_DIM];
[lettura file]
unsigned int contatoreRighe=1;
unsigned int pos1=0;
unsigned int pos2=0;
unsigned int i;
while ((array[pos1])&&(array2[pos2]))
{
for (i=0;((array1[pos1]!=.../* ascii di invio */)&&(array1[pos1]));pos1++,i++)
aux1[i]=array1[pos1];
aux1[i]='\0'; // chiude la stringa copiata carattere per carattere
for (i=0;((array2[pos2]!=.../*ascii di invio */)&&(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++;
}
un altro sistema che fa risparmiare memoria è quello di leggere carattere per carattere dai due file e memorizzare una riga per volta per ciascun file usando un contatore per le righe finora scandite. si confrontano i due array quando si trova il carattere di invio che NON va copiato mentre va messo un '\0' al suo posto e se non sono uguali si stampa la seconda con l'indice di riga. credo sia più lento come sistema però fa risparmiare memoria. dipende dalle specifiche e dalle dimensioni. anche usare dei puntatori con allocazione dinamica è figo :D ma bisogna vedere quanto tempo impiega il so ad allocare le aree di memoria rispetto alla durata di tutto il programma. secondo me non ne vale la pena.
char array1[MAX_DIM];
char array2[MAX_DIM];
char aux1[MAX_DIM];
char aux2[MAX_DIM];
scusa... ma MAX_DIM lo dovrò definire da qualche aprte... io però non ho nessuna limitazione...
scusa... ma MAX_DIM lo dovrò definire da qualche aprte... io però non ho nessuna limitazione...
Solitamente quando vedi delle costanti scritte in maiuscolo sono definite tramite direttiva #define. Eg.
#define MAX_DIM 80
durante la fase di compilazione, il compilatore andrà a sostituire tutte MAX_DIM con 80, il che significa che questo tipo di dichiarazione non va ad aumentare la dimensione del segmento dati in memoria di programma ;)
la cosa piu importante, SAI confrontare le stringe :P
la cosa piu importante, SAI scrivere stringhe :D
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.