commande cmp renvoyant EOF sur ma sortie malgré une correspondance exacte pour autant que je sache

Donc, je vais commencer par dire que c’est pour un cours et je suppose que le professeur ne se souciera pas vraiment du fait que cmp retourne quelque chose de bizarre. Je tente de comparer la sortie de mon code, nommé uout, à la sortie correcte du fichier correct0. Le problème est cependant qu’il renvoie “cmp: EOF on uout”. A partir d’un peu de recherche, j’ai trouvé que EOF indique qu’ils sont les mêmes jusqu’à la fin du fichier le plus court, le fichier le plus court étant celui qui porte le nom d’EOF. . Le problème est cependant que cela ne finit absolument pas court. Lors de l’ouverture à la fois dans un éditeur de texte et en vérifiant manuellement les espaces, les numéros de ligne et de colonne, etc., tout était une correspondance EXACT.

Pour illustrer mon propos, voici les fichiers copiés directement en utilisant ctrl-a + ctrl-v:

correct0 http://pastebin.com/Bx7SM7rA

uout http://pastebin.com/epMFtFpM

Si quelqu’un sait ce qui ne va pas et peut l’expliquer simplement, je l’apprécierais. J’ai vérifié plusieurs fois et je ne trouve rien de mal à cela. Peut-être que c’est quelque chose de simple et que je ne peux tout simplement pas le voir, mais tout ce que j’ai vu jusqu’à présent semble suggérer que les fichiers sont les mêmes jusqu’à ce que le “plus court”

cmp correct0 uout 

à

 cmp uout correct0 

les deux instances finissent par revenir

 cmp: EOF on uout 

Les fichiers que vous avez téléchargés sont les mêmes. Cela peut être un problème de fin de ligne. DOS / Windows utilise “\ r \ n” comme fin de ligne, mais Unix / Linux utilise juste un “\ n”.

Le meilleur utilitaire sur machine Linux pour vérifier votre problème est “od” (octal dump) ou toute autre commande pour afficher des fichiers dans leur format binary. C’est:

 $ od -c uout.txt 0000000 E nterthenumber 0000020 sfrom 1 to 1 6 i 0000040 nanyorder , sep 0000060 aratedbyspaces 0000100 : \r \n \r \n 1 6 3 2 1 0000120 3 \r \n 5 1 0 1 1 8 \r 0000140 \n 9 6 7 1 2 \r \n 0000160 4 1 5 1 4 1 \r \n \r \n R 0000200 owsums : 3 4 3 4 3 0000220 4 3 4 \r \n C olumnsum 0000240 s : 3 4 3 4 3 4 3 4 \r \n 0000260 D iagonalsums : 3 0000300 4 3 4 \r \n \r \n T hematr 0000320 ixisamagicsq 0000340 uare 0000344 

Comme vous pouvez le voir, ici les fins de ligne sont \ r \ n. Puisque vous avez ouvert et copié les fichiers collés, cela représente les préférences de votre machine et non la fin de ligne réelle. Vous pouvez également essayer l’utilitaire dos2unix pour convertir les fins de ligne.

Si les fichiers sont lisibles par l’homme, j’utiliserais plutôt l’outil diff . Il a plusieurs façons d’ignorer les fins de ligne (voir les --ignore-space-change et --ssortingp-trailing-cr et --ignore-blank-lines ).

 diff -u --ignore-space-change --ssortingp-trailing-cr --ignore-blank-lines test_cases/correct0 test_cases/uout0