Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Можно ли сделать код для сравнения двух файлов быстрее и красивее ?
|
|||
|---|---|---|---|
|
#18+
Здравствуйте. В книге прочитал про программу diff с ключом -w. Данная программа игнорирует различия версий файлов связанных с наличием отступов, пробелов и других пустых мест. Решил написать её сам, написал код, но мне не кажется что он самый оптимальный и красивый. Подскажите как его оптимизировать, пожалуйста. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2014, 04:11 |
|
||
|
Можно ли сделать код для сравнения двух файлов быстрее и красивее ?
|
|||
|---|---|---|---|
|
#18+
1. Не используется константа EOF, что плохо 2. Не закрываются открытые файлы 3. Проверка результата и печать в одном месте. Получается слишком специализированная функция, заточенная под программу 4. Для проверки на пробельность есть функция isspace 5. else if (f1_c == f2_c) должно было быть впереди, так как непробельных символов в файлах больше, чем пробельных 6. Дубли кода "if (f2_c == ' ' || f2_c== '\n')" надо вынести в одно место, это проверки одного вида 7. Да и вообще, сравнивать два файла скучно Сравнивайте сразу много файлов Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2014, 06:53 |
|
||
|
Можно ли сделать код для сравнения двух файлов быстрее и красивее ?
|
|||
|---|---|---|---|
|
#18+
41 Белый Котик, Код: plaintext 1. Ребятушки, осадите. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2014, 09:33 |
|
||
|
Можно ли сделать код для сравнения двух файлов быстрее и красивее ?
|
|||
|---|---|---|---|
|
#18+
SashaMercury, Напиши функцию int next_nonspace(FILE* f) которая возвращает следующий не isspace символ и радуйся: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2014, 14:37 |
|
||
|
Можно ли сделать код для сравнения двух файлов быстрее и красивее ?
|
|||
|---|---|---|---|
|
#18+
SashaMercury, Саш строго говоря такой код можно было писать лет 20 назад и то с оговорками. В наше время ЛЮБАЯ задача обработки текстовых файлов вызывает главный вопрос. С какой кодировкой будет файл. У нас собственно есть варианты: windows-1251 (1-байтная), cpp866 (1-байтная устаревшая), unicode-16(UTF-16) (2-байтная), utf-8 (плавающая разрядность). Есть еще также редкие koi8- и прочие от устаревших ЭВМ но существующие в виде интернет контента. Поэтому твой софт должен содержать конвейер из двух фильтров для f1, f2 и выдавать на выходе UNICODE-текст который ты будешь сравнивать по правилам текста. Все прочие попытки реализовать текстовое сравнение двух файлов как сравнение бинарей (побайтно) - это профанация. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2014, 17:36 |
|
||
|
Можно ли сделать код для сравнения двух файлов быстрее и красивее ?
|
|||
|---|---|---|---|
|
#18+
SashaMercury, самый короткий код - тот, что использует имеющиеся средства вот пример только со стандарной библиотекой: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. пример работы Код: powershell 1. 2. 3. 4. 5. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.07.2014, 01:26 |
|
||
|
Можно ли сделать код для сравнения двух файлов быстрее и красивее ?
|
|||
|---|---|---|---|
|
#18+
c guySashaMercury, самый короткий код - тот, что использует имеющиеся средства вот пример только со стандарной библиотекой: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. самый лучший пример на С, который я видел в своей жизни пример работы Код: powershell 1. 2. 3. 4. 5. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.07.2014, 16:59 |
|
||
|
Можно ли сделать код для сравнения двух файлов быстрее и красивее ?
|
|||
|---|---|---|---|
|
#18+
c guy, отличный пример на С, я щитаю, лучший, имхо P.S. сорри за оверквотинг выше, рука дрогнула ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.07.2014, 17:01 |
|
||
|
Можно ли сделать код для сравнения двух файлов быстрее и красивее ?
|
|||
|---|---|---|---|
|
#18+
Кстати, не работает. f1.txt Код: plaintext 1. 2. 3. 4. 5. f1.txt Код: plaintext 1. 2. 3. 4. 5. 6. 7. Код: plaintext 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.07.2014, 17:29 |
|
||
|
Можно ли сделать код для сравнения двух файлов быстрее и красивее ?
|
|||
|---|---|---|---|
|
#18+
Второй файл называется f2.txt, а не f1.txt ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.07.2014, 17:30 |
|
||
|
Можно ли сделать код для сравнения двух файлов быстрее и красивее ?
|
|||
|---|---|---|---|
|
#18+
Отступы, пробелы, табуляторы... Игнорируем? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.07.2014, 17:36 |
|
||
|
Можно ли сделать код для сравнения двух файлов быстрее и красивее ?
|
|||
|---|---|---|---|
|
#18+
29 Белых Котиков, да, как оказалось istream_iterator молча бежит за пределы, а mismatch не проверяет на выбегание второй из них, поэтому стандартный алгоритм выкидываем и пишем свой в 3 строчки: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2014, 01:59 |
|
||
|
Можно ли сделать код для сравнения двух файлов быстрее и красивее ?
|
|||
|---|---|---|---|
|
#18+
Здравствуйте. Спасибо всем за ответы и примеры. maytonSashaMercury, Саш строго говоря такой код можно было писать лет 20 назад и то с оговорками. В наше время ЛЮБАЯ задача обработки текстовых файлов вызывает главный вопрос. С какой кодировкой будет файл. У нас собственно есть варианты: windows-1251 (1-байтная), cpp866 (1-байтная устаревшая), unicode-16(UTF-16) (2-байтная), utf-8 (плавающая разрядность). Есть еще также редкие koi8- и прочие от устаревших ЭВМ но существующие в виде интернет контента. Поэтому твой софт должен содержать конвейер из двух фильтров для f1, f2 и выдавать на выходе UNICODE-текст который ты будешь сравнивать по правилам текста. Все прочие попытки реализовать текстовое сравнение двух файлов как сравнение бинарей (побайтно) - это профанация. Да.. вы конечно смотрите дальше меня. Ибо я сегодня пытался написать функцию, для вывода каждого слова на новую строку в стандартный поток вывода, но вероятно возникли проблемы с кодировкой файла. Выводит то выводит, но не то. Это был первый вариант: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. Тогда я решил написать так: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. Ну и как вы понимаете ничего не получилось. Сейчас почитаю про кодировки более подробно, вы были правы изначально. egorych c guy, отличный пример на С, я щитаю, лучший, имхо P.S. сорри за оверквотинг выше, рука дрогнула а я только хотел сказать что это ведь не Си, потому этот код я разберу позже :) Anatoly Moskovsky Код: plaintext 1. Ребятушки, осадите Неверно приведение к FILE** или к типу FILE нельзя применять SIZEOF() ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2014, 03:51 |
|
||
|
Можно ли сделать код для сравнения двух файлов быстрее и красивее ?
|
|||
|---|---|---|---|
|
#18+
Прочитал это и это . Не до конца понял только одну фразу авторUTF-16 и UTF-8 являются кодировками с переменной длиной кодирования. Если символ может быть закодирован одним байтом(потому что номер пункта символа очень маленький), UTF-8 закодирует его одним байтом. Если нужно 2 байта, то используется 2 байта. Кодировка сообщает старшими битами, сколькими битами кодируется текущий символ. Такой способ экономит место, но так же и тратит его в случае, если эти сигнальные биты часто используются. UTF-16 является компромиссом: все символы как минимум двухбайтные, но их размер может увеличиваться до 4 байт, если нужно. То есть существует спец символ в начале набора байта, как конец строки '\0',и в этом спецсимволе хранится размер того, сколько байт занимает один символ ? Я могу прочитать это значение из файла txt ? У меня может идти английский текст вперемешку с русским, а если я ещё перемещаю с китайским, то я все символы буду хранить по 4 байта, или произойдёт разбиение на блоки ? Значит блок в котором хранится количество байт на один символ должен как-то маркироваться. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2014, 08:56 |
|
||
|
Можно ли сделать код для сравнения двух файлов быстрее и красивее ?
|
|||
|---|---|---|---|
|
#18+
Зачем задавать так много глупых вопросов, если UTF8 разжёван на каждом углу??? А в UTF16 единственный неочевидный момент - суррогатные пары. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2014, 09:05 |
|
||
|
Можно ли сделать код для сравнения двух файлов быстрее и красивее ?
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2014, 09:12 |
|
||
|
Можно ли сделать код для сравнения двух файлов быстрее и красивее ?
|
|||
|---|---|---|---|
|
#18+
Basil A. Sidorov, я очень сомневаюсь, что вопросы касаемо стандартов можно назвать глупыми. Возможно вы хотели сказать -"тех вопросов, ответы на которые можно или нужно найти самому", хотя я прочитал в нескольких источниках и ответа на этот вопрос не нашёл. Можно называть глупыми людей, что не задают вопросов прочитав то или иное, или не ставит под сомнение то или иное. Или считающих глупыми вопросы несущие фундаментальных характер. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2014, 09:17 |
|
||
|
Можно ли сделать код для сравнения двух файлов быстрее и красивее ?
|
|||
|---|---|---|---|
|
#18+
SashaMercuryBasil A. Sidorov, я очень сомневаюсь, что вопросы касаемо стандартов можно назвать глупымиВаши вопросы касались не стандартов и даже не описания форматов, конкретных статей. Так вот - глупо задавать такие вопросы, если и стандарт и описание (очень простого) формата гуглятся за пару минут: просто вбили "utf8" в поисковик и две первые ссылки будут на русскую и английскую статьи вики. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2014, 09:25 |
|
||
|
Можно ли сделать код для сравнения двух файлов быстрее и красивее ?
|
|||
|---|---|---|---|
|
#18+
SashaMercuryТо есть существует спец символ в начале набора байта, как конец строки '\0',и в этом спецсимволе хранится размер того, сколько байт занимает один символ ? Я могу прочитать это значение из файла txt ? По информации с Вики Код: plaintext 1. 2. 3. 4. 5. 6. Я-бы пояснил это так. Кодировка Utf-8 использует "унарный код". Это код в котором количество подряд идущих единичек интерпретируется как 1 разряд унарной системы. Разделителем конечно-же является нолик. Здесь только исключением сделали шаблон "0*" Для диапазона [0..127] символов ASCII совпадает с этим шаблоном поэтому utf-8 частично совместима с 1 байтной кодировкой. Для национальных кодовых страниц будет шаблон "110*" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2014, 12:22 |
|
||
|
Можно ли сделать код для сравнения двух файлов быстрее и красивее ?
|
|||
|---|---|---|---|
|
#18+
авторУ меня может идти английский текст вперемешку с русским, а если я ещё перемещаю с китайским, то я все символы буду хранить по 4 байта, или произойдёт разбиение на блоки ? Значит блок в котором хранится количество байт на один символ должен как-то маркироваться. Нет. В текстовом файле нет блоков. Каждый символ - сам по себе. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2014, 12:24 |
|
||
|
Можно ли сделать код для сравнения двух файлов быстрее и красивее ?
|
|||
|---|---|---|---|
|
#18+
Модератор: Отредактировано utf8 - байтовая кодировка. В частности, она полностью совместима со стандартными строковыми функциями це-рантайма. P.S. Юникод ограничен базовой плоскостью и шестнадцатью дополнительным, поэтому более четырех байт на кодовую точку в UTF8 строке никогда не будет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2014, 13:51 |
|
||
|
Можно ли сделать код для сравнения двух файлов быстрее и красивее ?
|
|||
|---|---|---|---|
|
#18+
mayton, теперь понятно, спасибо. Не все конечно. Но понятно. я сделал такую функцию Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. А вот ее вызов Код: plaintext 1. Но это порнография, ибо она не реентерабельна. PS Понял почему меня постоянно поправляли когда в сигнатуре функции я порой писал параметры без квалификатора const. Тем самым можно сразу показать что этот аргумент(с квалификатором const) меняться не будет, и передача значения по адресу происходит для другой цели, как в данном конкретном случае, fe. Модератор: Отредактировано ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.07.2014, 04:44 |
|
||
|
Можно ли сделать код для сравнения двух файлов быстрее и красивее ?
|
|||
|---|---|---|---|
|
#18+
SashaMercuryя сделал такую функциюНе очень, правда, понятно, зачем вам локаль, если вы её не используете и почему вас заботит работа этой функции в многопоточном окружении? Особенно, с учётом того, что единственный разделяемый ресурс - стандартный поток вывода. вариант Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 1. Засчитывается лишнее слово, если файл начинается с разделителя; 2. Принудительная конвертация сиволов конца строки в unix-вариант; 3. Не вполне обоснованный выбор списка разделителей и полное отсутствие анализа некоторых сочетаний. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.07.2014, 08:41 |
|
||
|
Можно ли сделать код для сравнения двух файлов быстрее и красивее ?
|
|||
|---|---|---|---|
|
#18+
4. Не засчитывается последнее слово, если файл не заканчивается разделителем. 5. Не проверялась компилируемость ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.07.2014, 08:46 |
|
||
|
Можно ли сделать код для сравнения двух файлов быстрее и красивее ?
|
|||
|---|---|---|---|
|
#18+
Basil A. Sidorov, я делал акцент на работу с кодировкой, то есть чтобы на поток вывода печаталась кириллица. Потому, вполне вероятно что алгоритм не идеален. Но код компилируется, всё нормально. А где в данном коде работа с символами ? В случае если в файле будет кириллица, то вывод в stdout возможно будет некорректный. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.07.2014, 07:27 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=38697094&tid=2019358]: |
0ms |
get settings: |
8ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
69ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
53ms |
get tp. blocked users: |
1ms |
| others: | 11ms |
| total: | 171ms |

| 0 / 0 |
