#définir MAX_LINE_LENGTH 1024
int main(int argc, char *argv[]) {
si (argc !=3) {
fprintf(stderr, "Utilisation :%s fichier1 fichier2\n", argv[0]);
renvoyer 1 ;
}
FICHIER *file1 =fopen(argv[1], "r");
FICHIER *file2 =fopen(argv[2], "r");
si (fichier1 ==NULL || fichier2 ==NULL) {
perror("Erreur à l'ouverture du fichier");
renvoyer 1 ;
}
char ligne1[MAX_LINE_LENGTH], ligne2[MAX_LINE_LENGTH];
int numéro_ligne =1 ;
while (fgets(line1, MAX_LINE_LENGTH, file1) !=NULL || fgets(line2, MAX_LINE_LENGTH, file2) !=NULL) {
// Gère les cas où un fichier contient plus de lignes que l'autre
if (fgets(line1, MAX_LINE_LENGTH, file1) ==NULL) {
printf("%d<%s", numéro_ligne, ligne2); // Ligne ajoutée dans le fichier2
} sinon if (fgets(line2, MAX_LINE_LENGTH, file2) ==NULL) {
printf("%d> %s", numéro_ligne, ligne1); // Ligne ajoutée dans le fichier1
} sinon if (strcmp(line1, line2) !=0) {
printf("%d:%s%d:%s", numéro_ligne, ligne1, numéro_ligne, ligne2); // Les lignes diffèrent
}
numéro_ligne++;
}
fclose(fichier1);
fclose(fichier2);
renvoie 0 ;
}
```
Explication :
1. Comprend : Fichiers d'en-tête nécessaires pour les entrées/sorties standard, les fonctions de bibliothèque standard et la manipulation de chaînes.
2. Gestion des arguments : Vérifie si exactement deux noms de fichiers sont fournis comme arguments de ligne de commande.
3. Ouverture de fichier : Ouvre les deux fichiers en mode lecture ("r"). La gestion des erreurs est incluse pour vérifier les échecs d’ouverture de fichiers.
4. Comparaison ligne par ligne : La boucle « while » lit les lignes des deux fichiers en utilisant « fgets ». Il compare les lignes en utilisant `strcmp`.
5. Rapports de différence : Si les lignes diffèrent ou si un fichier contient plus de lignes que l'autre, il imprime une indication de la différence, y compris le numéro de ligne. Il s'agit d'un rapport de différence très basique – un véritable « diff » offrirait des formats de sortie plus sophistiqués.
6. Fermeture du dossier : Ferme les deux fichiers pour libérer des ressources.
Pour compiler et exécuter (sur un système avec un compilateur C comme GCC) :
1. Enregistrez le code sous « mydiff.c ».
2. Compilez :`gcc mondiff.c -o mondiff`
3. Exécutez :`./mydiff file1.txt file2.txt` (remplacez `file1.txt` et `file2.txt` par vos noms de fichiers)
Limites :
* Comparaison simple ligne par ligne : Il ne gère pas les scénarios plus complexes comme les lignes déplacées ou les différents espaces.
* Aucune option : Il lui manque les nombreuses options du vrai « diff » (par exemple, « -u » pour un diff unifié).
* Gestion des erreurs : La gestion des erreurs est minime. Une version robuste gérerait davantage d'erreurs potentielles (par exemple, fichiers trop volumineux, échecs d'allocation de mémoire).
* Limite de longueur de ligne : La macro `MAX_LINE_LENGTH` limite la longueur des lignes qu'elle peut gérer.
Pour créer un programme de type « diff » plus complet, vous devrez implémenter des algorithmes plus sophistiqués (comme l'algorithme de comparaison de Myers), gérer divers formats de sortie de différence et ajouter une vérification complète des erreurs et une analyse des options. Il s’agit d’une entreprise importante. Cet exemple simplifié fournit une compréhension de base du concept de base.