#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.