#Define Max_Line_Length 1024
int main (int argc, char *argv []) {
if (argc! =3) {
fprintf (stderr, "Användning:%s fil1 fil2 \ n", argv [0]);
return 1;
}
Fil *fil1 =fopen (argv [1], "r");
Fil *fil2 =fopen (argv [2], "r");
if (fil1 ==null || fil2 ==null) {
perror ("Felöppningsfil");
return 1;
}
char line1 [max_line_length], line2 [max_line_length];
int line_num =1;
medan (fgets (line1, max_line_length, fil1)! =null || fgets (line2, max_line_längd, fil2)! =null) {
// Hantera fall där en fil har fler rader än den andra
if (fgets (line1, max_line_length, fil1) ==null) {
printf (" %d <%s", line_num, line2); // rad läggs till i fil2
} annars om (fgets (line2, max_line_length, fil2) ==null) {
printf (" %d> %s", line_num, line1); // rad läggs till i fil1
} annars om (STRCMP (LINE1, LINE2)! =0) {
printf (" %d:%s %d:%s", line_num, line1, line_num, line2); // linjer skiljer sig åt
}
line_num ++;
}
fclose (fil1);
fclose (fil2);
return 0;
}
`` `
Förklaring:
1. inkluderar: Nödvändiga rubrikfiler för standardinmatning/utgång, standardbiblioteksfunktioner och strängmanipulation.
2. Argumenthantering: Kontroller om exakt två filnamn tillhandahålls som kommandoradsargument.
3. Filöppning: Öppnar båda filerna i läsläge ("R"). Felhantering ingår för att kontrollera om filöppningsfel.
4. Line-by-Line Jämförelse: "Medan" -slingan läser rader från båda filerna som använder "fgets". Den jämför linjer med `STRCMP '.
5. Skillnadsrapportering: Om linjer skiljer sig eller en fil har fler rader än den andra, skriver den ut en indikation på skillnaden, inklusive radnumret. Detta är en mycket grundläggande skillnadsrapport - en riktig "diff" skulle erbjuda mer sofistikerade utgångsformat.
6. Filstängning: Stänger båda filerna för att släppa resurser.
för att kompilera och köra (på ett system med en C -kompilator som GCC):
1. Spara koden som `mydiff.c`.
2. Kompilera:`gcc mydiff.c -o mydiff`
3. Kör:`./mydiff fil1.txt fil2.txt` (ersätt` fil1.txt` och `fil2.txt` med dina filnamn)
Begränsningar:
* enkel linje-för-linje jämförelse: Det hanterar inte mer komplexa scenarier som flyttade linjer eller olika vitrum.
* Inga alternativ: Det saknar de många alternativen för den verkliga "diff" (t.ex. `-u` för enhetlig diff).
* Felhantering: Felhantering är minimal. En robust version skulle hantera fler potentiella fel (t.ex. filer för stora, minnesallokeringsfel).
* Linjelängdsgräns: Makroen `max_line_längd 'begränsar längden på linjerna den kan hantera.
För att bygga ett mer komplett "diff" -liknande program måste du implementera mer sofistikerade algoritmer (som Myers Diff-algoritmen), hantera olika diff-utgångsformat och lägga till omfattande felkontroll och alternativa parsing. Detta är ett betydande företag. Detta förenklade exempel ger en grundläggande förståelse för kärnkonceptet.