Λειτουργικά συστήματα

Γνώση Υπολογιστών >> Λειτουργικά συστήματα >  >> Unix

Πώς γράφετε ένα πρόγραμμα C για την εντολή DIFF που χρησιμοποιούμε στο UNIX;

Δεν μπορείτε να αναπαράγετε απόλυτα την πλήρη λειτουργικότητα της εντολής UNIX `Diff` σε ένα συνοπτικό πρόγραμμα C. Το «Diff» είναι μια εκλεπτυσμένη χρησιμότητα με πολλές επιλογές και αλγόριθμους για τη διαχείριση διαφορετικών τύπων αρχείων και μεθόδων σύγκρισης (ενοποιημένο, πλαίσιο κλπ.). Ωστόσο, μπορούμε να δημιουργήσουμε μια απλοποιημένη έκδοση που συγκρίνει δύο αρχεία κειμένου γραμμής ανά γραμμή και αναφέρει διαφορές.

Αυτό το πρόγραμμα επικεντρώνεται στην απλούστερη μορφή σύγκρισης γραμμής ανά γραμμή, αναφοράς προστιθέμενων και διαγραμμένων γραμμών:

`` `c

#include

#include

#include

#define max_line_length 1024

int main (int argc, char *argv []) {

αν (argc! =3) {

fprintf (stderr, "Χρήση:%s file1 file2 \ n", argv [0]);

επιστροφή 1;

}

Αρχείο *Αρχείο1 =fopen (argv [1], "r");

Αρχείο *Αρχείο2 =fopen (argv [2], "r");

αν (αρχείο1 ==null || file2 ==null) {

perror ("Αρχείο ανοίγματος σφάλματος");

επιστροφή 1;

}

char line1 [max_line_length], line2 [max_line_length];

int line_num =1;

ενώ (fgets (line1, max_line_length, file1)! =null || fgets (line2, max_line_length, file2)! =null) {

// Χειριστείτε περιπτώσεις όπου ένα αρχείο έχει περισσότερες γραμμές από το άλλο

αν (fgets (line1, max_line_length, file1) ==null) {

printf (" %d <%s", line_num, line2); // line προστέθηκε στο αρχείο2

} else αν (fgets (line2, max_line_length, file2) ==null) {

printf (" %d> %s", line_num, line1); // line προστέθηκε στο αρχείο1

} else αν (strcmp (line1, line2)! =0) {

printf (" %d:%s %d:%s", line_num, line1, line_num, line2); // Οι γραμμές διαφέρουν

}

line_num ++;

}

fclose (αρχείο1);

FCLOSE (File2);

επιστροφή 0;

}

`` `

Επεξήγηση:

1. Περιλαμβάνει: Τα απαραίτητα αρχεία κεφαλίδας για τυποποιημένη είσοδο/έξοδο, τυποποιημένες λειτουργίες βιβλιοθήκης και χειραγώγηση συμβολοσειρών.

2. Χειρισμός επιχειρήματος: Ελέγχει εάν παρέχονται ακριβώς δύο ονόματα αρχείων ως επιχειρήματα γραμμής εντολών.

3. Άνοιγμα αρχείου: Ανοίγει και τα δύο αρχεία σε λειτουργία ανάγνωσης ("R"). Ο χειρισμός σφαλμάτων περιλαμβάνεται για να ελέγξετε τις αποτυχίες ανοίγματος αρχείων.

4. Σύγκριση γραμμής-γραμμής: Ο βρόχος "ενώ ο βρόχος διαβάζει γραμμές και από τα δύο αρχεία χρησιμοποιώντας" fgets ". Συγκρίνει γραμμές χρησιμοποιώντας `strcmp`.

5. Αναφορά διαφοράς: Εάν οι γραμμές διαφέρουν ή ένα αρχείο έχει περισσότερες γραμμές από το άλλο, εκτυπώνει μια ένδειξη της διαφοράς, συμπεριλαμβανομένου του αριθμού γραμμής. Πρόκειται για μια πολύ βασική αναφορά διαφοράς - ένα πραγματικό `diff` θα προσφέρει πιο εξελιγμένες μορφές εξόδου.

6. Κλείσιμο αρχείων: Κλείνει και τα δύο αρχεία για την απελευθέρωση των πόρων.

Για να μεταγλωττίσετε και να εκτελέσετε (σε ένα σύστημα με έναν μεταγλωττιστή C όπως το GCC):

1. Αποθηκεύστε τον κώδικα ως `mydiff.c`.

2. Compile:`gcc mydiff.c -o mydiff '

3. Εκτέλεση:`./mydiff file1.txt file2.txt`

Περιορισμοί:

* Απλή σύγκριση γραμμής ανά γραμμή: Δεν χειρίζεται πιο περίπλοκα σενάρια όπως μετακινούμενες γραμμές ή διαφορετικά κενά.

* Χωρίς επιλογές: Δεν διαθέτει τις πολυάριθμες επιλογές του πραγματικού «diff» (π.χ., `-u` για ενοποιημένη διαφορά).

* Χειρισμός σφαλμάτων: Ο χειρισμός των σφαλμάτων είναι ελάχιστος. Μια ισχυρή έκδοση θα χειριζόταν περισσότερα πιθανά σφάλματα (π.χ. αρχεία πολύ μεγάλα, αποτυχίες κατανομής μνήμης).

* Όριο μήκους γραμμής: Η μακροεντολή `max_line_length` περιορίζει το μήκος των γραμμών που μπορεί να χειριστεί.

Για να δημιουργήσετε ένα πιο ολοκληρωμένο πρόγραμμα «Diff», θα πρέπει να εφαρμόσετε πιο εξελιγμένους αλγόριθμους (όπως ο αλγόριθμος Myers Diff), να χειρίζεστε διάφορες μορφές εξόδου και να προσθέσετε ολοκληρωμένο έλεγχο σφαλμάτων και επιλογές επιλογής. Αυτή είναι μια σημαντική επιχείρηση. Αυτό το απλοποιημένο παράδειγμα παρέχει μια βασική κατανόηση της βασικής έννοιας.

Συναφής σύστασή

Πνευματικά δικαιώματα © Γνώση Υπολογιστών Όλα τα δικαιώματα κατοχυρωμένα