Welkom op de Nederland Computer Kennisnetwerk!  
 
Zoeken computer kennis
Home Hardware Netwerken Programmering Software Computerstoring Besturingssysteem
Computer Kennis >> Besturingssysteem >> unix >> Content
Hoe schrijf je een c-programma voor de diff-opdracht die we in Unix gebruiken?
Je kunt niet perfect de volledige functionaliteit van het Unix `diff`-commando repliceren in een beknopt C-programma. `diff` is een geavanceerd hulpprogramma met veel opties en algoritmen voor het verwerken van verschillende bestandstypen en vergelijkingsmethoden (unified, context, etc.). We kunnen echter een vereenvoudigde versie maken waarin twee tekstbestanden regel voor regel worden vergeleken en de verschillen worden gerapporteerd.

Dit programma richt zich op de eenvoudigste vorm van regel-voor-regel vergelijking, waarbij toegevoegde en verwijderde regels worden gerapporteerd:

```c

#include

#include

#include

#define MAX_LINE_LENGTH 1024

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

als (argc !=3) {

fprintf(stderr, "Gebruik:%s bestand1 bestand2\n", argv[0]);

retour 1;

}

BESTAND *bestand1 =fopen(argv[1], "r");

BESTAND *bestand2 =fopen(argv[2], "r");

if (bestand1 ==NULL || bestand2 ==NULL) {

perror("Fout bij openen bestand");

retour 1;

}

teken regel1[MAX_LINE_LENGTH], regel2[MAX_LINE_LENGTH];

int regel_num =1;

while (fgets(lijn1, MAX_LINE_LENGTH, bestand1) !=NULL || fgets(lijn2, MAX_LINE_LENGTH, bestand2) !=NULL) {

// Behandel gevallen waarin het ene bestand meer regels bevat dan het andere

if (fgets(regel1, MAX_LINE_LENGTH, bestand1) ==NULL) {

printf("%d<%s", line_num, line2); // Lijn toegevoegd in bestand2

} else if (fgets(line2, MAX_LINE_LENGTH, file2) ==NULL) {

printf("%d> %s", regel_num, regel1); // Regel toegevoegd in bestand1

} else if (strcmp(regel1, regel2) !=0) {

printf("%d:%s%d:%s", regel_num, regel1, regel_num, regel2); // Lijnen verschillen

}

line_num++;

}

fsluiten(bestand1);

fsluiten(bestand2);

retour 0;

}

```

Uitleg:

1. Inclusief: Noodzakelijke headerbestanden voor standaardinvoer/uitvoer, standaardbibliotheekfuncties en tekenreeksmanipulatie.

2. Argumentafhandeling: Controleert of er precies twee bestandsnamen als opdrachtregelargumenten worden opgegeven.

3. Bestanden openen: Opent beide bestanden in leesmodus ("r"). Foutafhandeling is inbegrepen om te controleren op fouten bij het openen van bestanden.

4. Regel-voor-regel vergelijking: De 'while'-lus leest regels uit beide bestanden met behulp van 'fgets'. Het vergelijkt lijnen met behulp van `strcmp`.

5. Verschilrapportage: Als regels verschillen of het ene bestand meer regels heeft dan het andere, wordt een indicatie van het verschil afgedrukt, inclusief het regelnummer. Dit is een heel basaal verschilrapport – een echt 'diff' zou meer geavanceerde uitvoerformaten bieden.

6. Bestand sluiten: Sluit beide bestanden om bronnen vrij te geven.

Om te compileren en uit te voeren (op een systeem met een C-compiler zoals GCC):

1. Sla de code op als `mydiff.c`.

2. Compileer:`gcc mijndiff.c -o mijndiff`

3. Voer uit:`./mydiff file1.txt file2.txt` (vervang `file1.txt` en `file2.txt` door uw bestandsnamen)

Beperkingen:

* Eenvoudige regel-voor-regel vergelijking: Het kan geen complexere scenario's aan, zoals verplaatste lijnen of andere witruimte.

* Geen opties: Het mist de talrijke opties van het echte `diff` (bijvoorbeeld `-u` voor verenigde diff).

* Foutafhandeling: Foutafhandeling is minimaal. Een robuuste versie zou meer potentiële fouten kunnen verwerken (bijvoorbeeld te grote bestanden, fouten in de geheugentoewijzing).

* Limiet lijnlengte: De macro `MAX_LINE_LENGTH` beperkt de lengte van de regels die deze kan verwerken.

Om een ​​completer `diff`-achtig programma te bouwen, zou je meer geavanceerde algoritmen moeten implementeren (zoals het Myers diff-algoritme), verschillende diff-uitvoerformaten kunnen hanteren en uitgebreide foutcontrole en optie-parsing moeten toevoegen. Dit is een aanzienlijke onderneming. Dit vereenvoudigde voorbeeld geeft een basiskennis van het kernconcept.

Previous: Next:
  unix
·Wat is Unix Scheduler en hoe w…
·Hoe Monitor & Problemen SCO Un…
·Hoe te Zombie Processen Zie in…
·Hoe schrijf je een c-programma…
·Wat is de uitvoer van het opdr…
·Wat is het conceptuele verschi…
·Welk besturingssysteem wordt b…
·Hoe om te controleren op Runni…
·De locatie van een bestand wor…
  Related Articles
Wat is de definitie van computation en h…
Wat is een algoritme in de informatica e…
Wat is een schrijffout en welke invloed …
Wat betekent rekenen en hoe wordt het ge…
Wat zijn enkele belangrijke overwegingen…
Wat zijn enkele voorbeelden van beroemde…
Hoe werken computers en wat zijn de bela…
Hoe heeft de Turing-machine de ontwikkel…
Hoe kan ik een stapelteller effectief ge…
  Besturingssysteem Articles
·Hoe je foto's toevoegen aan een nieuwe m…
·Stappen voor het instellen van een nieuw…
·Waarom gebruik maken van energie-efficië…
·Hoe maak Vista Firewall Vraag Over Ieder…
·Hoe kan ik HTML insluiten in Evernote 
·Hoe u uw Windows Installer Fix 
·Hoe kan ik bestanden toevoegen aan het m…
·Hoe Windows 11 sneller te maken 
·Hoe te vergelijken Permissions in Window…
Copyright © Computer Kennis https://www.nldit.com