Questo programma si concentra sulla forma più semplice di confronto di linea per linea, reporting e linee aggiunte:
`` `c
#include
#include
#include
#define max_line_length 1024
int main (int argc, char *argv []) {
if (argc! =3) {
fprintf (stderr, "utilizzo:%s file1 file2 \ n", argv [0]);
Ritorno 1;
}
File *file1 =fopen (argv [1], "r");
File *file2 =fopen (argv [2], "r");
if (file1 ==null || file2 ==null) {
Perror ("File di apertura degli errori");
Ritorno 1;
}
char line1 [max_line_length], line2 [max_line_length];
int line_num =1;
while (fgets (riga1, max_line_length, file1)! =null || fgets (riga2, max_line_length, file2)! =null) {
// gestisce i casi in cui un file ha più righe dell'altro
if (fgets (riga1, max_line_length, file1) ==null) {
printf (" %d <%s", line_num, line2); // riga aggiunta nel file2
} else if (fgets (riga2, max_line_length, file2) ==null) {
printf (" %d> %s", line_num, line1); // riga aggiunta nel file1
} else if (strcmp (line1, line2)! =0) {
printf (" %d:%s %d:%s", line_num, line1, line_num, line2); // Le linee differiscono
}
line_num ++;
}
fclose (file1);
fclose (file2);
restituzione 0;
}
`` `
Spiegazione:
1. Include: File di intestazione necessari per input/output standard, funzioni della libreria standard e manipolazione delle stringhe.
2. Gestione dell'argomento: Verifica se esattamente due file di file sono forniti come argomenti della riga di comando.
3. Apertura del file: Apre entrambi i file in modalità di lettura ("R"). La gestione degli errori è inclusa per verificare gli errori di apertura dei file.
4. Confronto di linea per linea: Il loop `why` legge le righe di entrambi i file usando` fgets`. Confronta le linee usando `strcmp`.
5. Rapporti sulla differenza: Se le righe differiscono o un file ha più righe dell'altro, stampare un'indicazione della differenza, incluso il numero di riga. Questa è una relazione di differenza molto semplice:un vero "diff` offrirebbe formati di output più sofisticati.
6. Chiusura dei file: Chiude entrambi i file per rilasciare risorse.
da compilare ed eseguire (su un sistema con un compilatore C come GCC):
1. Salva il codice come `mydiff.c`.
2. Compila:`gcc mydiff.c -o mydiff`
3. Esegui:`./MyDiff File1.txt File2.txt` (Sostituisci` file1.txt` e `file2.txt` con i nomi dei file)
Limitazioni:
* Confronto di linea per linea semplice: Non gestisce scenari più complessi come linee mosse o diversi spazi bianchi.
* Nessuna opzione: Manca le numerose opzioni del vero `diff` (ad esempio,` -u` per differenze unificate).
* Gestione degli errori: La gestione degli errori è minima. Una versione robusta gestirebbe più potenziali errori (ad es. File troppo grandi, guasti di allocazione della memoria).
* Limite di lunghezza della linea: La macro `max_line_length` limita la lunghezza delle linee che può gestire.
Per costruire un programma "Diff" più completo, è necessario implementare algoritmi più sofisticati (come l'algoritmo differenziale Myers), gestire vari formati di output di differenziali e aggiungere un controllo di errori completi e analisi delle opzioni. Questa è un'impresa significativa. Questo esempio semplificato fornisce una comprensione di base del concetto di base.
Informazioni correlate
sistemi © www.354353.com