Home Hardware Networking Programmazione Software Domanda Sistemi
Conoscenza del computer >> sistemi >> Unix >> .

Come si scrive un programma C per il comando diff che utilizziamo in Unix?

Non è possibile replicare perfettamente l'intera funzionalità del comando UNIX `diff` in un programma C conciso. `Diff` è un'utilità sofisticata con molte opzioni e algoritmi per la gestione di diversi tipi di file e metodi di confronto (unificato, contesto, ecc.). Tuttavia, possiamo creare una versione semplificata che confronta due file di testo Line per riga e segnala differenze.

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.

 

sistemi © www.354353.com