2015-03-09 3 views
2

Так что я начну с того, что это будет курс, и я полагаю, что профессору все равно, что они одинаковы, если cmp возвращает что-то странное , Я пытаюсь сравнить выходные данные моего кода, названного uout, с правильным результатом, в файле correct0. Однако проблема заключается в том, что он возвращает «cmp: EOF on uout». Из небольшого количества копания я обнаружил, что EOF указывает, что они совпадают до конца более короткого файла, причем более короткий файл является именем, названным после EOF, поэтому я собираюсь из этого, что они одинаковы до тех пор, пока uout не закончится коротким , Проблема, однако, в том, что она совсем НЕ заканчивается. Открывая как текстовый редактор, так и вручную проверяя пробелы, номера строк и столбцов и т. Д., Все было ТОЧНЫМ.Команда cmp возвращает EOF на мой выход, несмотря на точный совпадение, насколько я могу сказать

Для того, чтобы проиллюстрировать мою точку здесь файлы, скопированные непосредственно с помощью Ctrl-A + Ctrl-V:

correct0http://pastebin.com/Bx7SM7rA

Uouthttp://pastebin.com/epMFtFpM

Если кто-нибудь знает, что происходит не так и может объяснить это просто, я был бы признателен. Я проверил несколько раз и не могу найти с ним ничего плохого. Может быть, это что-то простое, и я просто не вижу его, но все, что я видел до сих пор, кажется, предполагает, что файлы совпадают до тех пор, пока не закончится «более короткий», и странно, даже если я переключу свое исполнение с

cmp correct0 uout 

к

cmp uout correct0 

оба экземпляра в конечном итоге возвращаются

cmp: EOF on uout 
+1

Пожалуйста, разместите код и покажите, что должно работать, что работает и что не работает. –

+1

Начните с 'ls -l' в двух файлах. Если размеры разные, вы знаете, что есть проблема (и 'cmp' дает правильный ответ). Если они имеют одинаковый размер, выполните контрольную сумму для двух файлов ('md5sum' или что-то в этом роде). Если хеши разные, то и файлы; если хэши одинаковы, есть вероятность, что файлы одинаковы. Но один из этих тестов покажет, что файлы разные. –

+0

ls -l показывает, что между ними буквально разница в 1 байт, но я не знаю, как это могло бы быть, если символы, пробелы и все совпадают точно в редакторе. – user2763113

ответ

4

файлы, загруженные одинаковы. Это может быть проблема с окончанием строки. DOS/Windows использует «\ r \ n» в качестве строки, заканчивающейся, но Unix/Linux использует только «\ n».

Лучшая утилита на компьютере Linux для проверки вашей проблемы - это «od» (восьмеричный дамп) или любая другая команда для отображения файлов в их двоичном формате. То есть:

$ od -c uout.txt 
0000000 E n t e r  t h e  n u m b e r 
0000020 s  f r o m  1  t o  1 6  i 
0000040 n  a n y  o r d e r ,  s e p 
0000060 a r a t e d  b y  s p a c e s 
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 o w  s u m s :  3 4  3 4  3 
0000220 4  3 4 \r \n C o l u m n  s u m 
0000240 s :  3 4  3 4  3 4  3 4 \r \n 
0000260 D i a g o n a l  s u m s :  3 
0000300 4  3 4 \r \n \r \n T h e  m a t r 
0000320 i x  i s  a  m a g i c  s q 
0000340 u a r e 
0000344 

Как вы можете видеть, здесь концы строк - это \ r \ n. Поскольку вы открыли и копировали вставляемые файлы, это соответствует вашим предпочтениям в машинах, а не окончанию окончательной строки. Также вы можете попробовать утилиту dos2unix для преобразования окончаний строк.

+0

@ user2763113: Похоже, что файл не заканчивается завершением строки (CRLF). Вы должны убедиться, что ваши (текстовые) файлы всегда заканчиваются CRLF (если вы работаете с Windows, LF, если вы работаете в Unix). –

+0

Но я не понимаю, что оба файла были созданы на машине linux, от написания моей программы c до получения выходного файла с ./a.out < input > uout.Почему заканчиваются окна? – user2763113

+0

На самом деле я только что подумал. Я скомпилировал gcc, но, возможно, нам нужно использовать c99, и это может иметь значение? Я попробую и отчитаю. ОБНОВЛЕНИЕ: Это не имело значения. ls -l показывает размер файла за один байт (correct0 равно 218, а uout - 217) – user2763113