Vitajte na [www.pocitac.win] Pripojiť k domovskej stránke Obľúbené stránky

Domáce Hardware Siete Programovanie Softvér Otázka Systémy
počítačové znalosti >> Systémy >> unix >> .

Ako napíšete program C pre príkaz DIFF, ktorý používame v UNIX?

V stručnom programe C nemôžete dokonale replikovať úplnú funkčnosť príkazu UNIX `Diff`. „Diff` je sofistikovaná užitočnosť s mnohými možnosťami a algoritmami na spracovanie rôznych typov súborov a porovnávacích metód (Unified, Context atď.). Môžeme však vytvoriť zjednodušenú verziu, ktorá porovnáva riadok s dvoma textovými súbormi podľa riadkov a hlási rozdiely.

Tento program sa zameriava na najjednoduchšiu formu porovnania čiary po čiare, pri pridávaní správ a odstránených riadkov:

`` C

#include

#include

#include

#define max_line_length 1024

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

if (argc! =3) {

fprintf (stderr, "Použitie:%s file1 file2 \ n", argv [0]);

návrat 1;

}

File *file1 =fopen (argv [1], "r");

File *file2 =fopen (argv [2], "r");

if (file1 ==null || file2 ==null) {

Perror („Súbor otvárania chýb“);

návrat 1;

}

char riadok1 [max_line_length], riadok2 [max_line_length];

int line_num =1;

while (fgets (line1, max_line_length, file1)! =null || fgets (line2, max_line_length, file2)! =null) {

// manipulujte s prípadmi, keď má jeden súbor viac riadkov ako druhý

if (fgets (line1, max_line_length, file1) ==null) {

printf (" %d <%s", line_num, riadok2); // riadok pridaný v súbore2

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

printf (" %d> %s", line_num, riadok1); // riadok pridaný v súbore1

} else if (strcmp (riadok1, riadok2)! =0) {

printf (" %d:%s %d:%s", line_num, line1, line_num, riadok2); // riadky sa líšia

}

line_num ++;

}

fclose (file1);

fclose (file2);

návrat 0;

}

`` `

Vysvetlenie:

1. Zahŕňa: Potrebné súbory hlavičky pre štandardný vstup/výstup, štandardné funkcie knižnice a manipulácia s reťazcami.

2. Argument: Kontroluje, či sú presne dva názvy súborov poskytnuté ako argumenty príkazového riadku.

3. Otváranie súborov: Otvára oba súbory v režime čítania („R“). Pri kontrole zlyhaní otvorenia súborov je zahrnutá spracovanie chýb.

4. porovnanie po čiare: Slučka „Zatiaľ čo“ číta riadky z oboch súborov pomocou `fgets`. Porovnáva riadky pomocou `strcmp`.

5. Hlásenie rozdielu: Ak sa riadky líšia alebo jeden súbor má viac riadkov ako druhý, vytlačí indikáciu rozdielu vrátane čísla riadku. Toto je veľmi základná správa o rozdieloch - skutočný „rozdiel“ by ponúkol sofistikovanejšie výstupné formáty.

6 Zatvorí oba súbory na uvoľnenie zdrojov.

Zostaviť a spustiť (v systéme s kompilátorom C, ako je GCC):

1. Uložte kód ako `myDiff.c`.

2. Zostavte:`GCC MyDiff.C -o MyDiff`

3. Spustite:`./mydiff file1.txt file2.txt` (nahradiť` file1.txt` a `file2.txt` s názvami súborov)

Obmedzenia:

* jednoduché porovnanie po čiare: Nezodpovedá zložitejším scenárom, ako sú pohybujúce sa čiary alebo rôzne medzery.

* Žiadne možnosti: Chýba mu početné možnosti skutočného `dif` (napr." -U "pre jednotný dif).

* Manipulácia s chybami: Manipulácia s chybami je minimálna. Robustná verzia by zvládla viac potenciálnych chýb (napr. Súbory príliš veľké, zlyhania prideľovania pamäte).

* Limit dĺžky riadku: Makro `max_line_length` obmedzuje dĺžku riadkov, ktoré dokáže zvládnuť.

Ak chcete zostaviť kompletnejší program podobný „rozdielu“, musíte implementovať sofistikovanejšie algoritmy (napríklad Myers Drif algoritm), spracovať rôzne formáty výstupu Dif a pridať komplexnú kontrolu chýb a analýzu možností. Toto je významný záväzok. Tento zjednodušený príklad poskytuje základné pochopenie základného konceptu.

Najnovšie články

Copyright © počítačové znalosti Všetky práva vyhradené