Страницы

Поиск по вопросам

суббота, 14 декабря 2019 г.

Как определить, файл бинарный или текстовый?

#cpp #c #алгоритм


Дан произвольный файл. Требуется написать программу (C/C++), определяющую, является
он текстовым или бинарным. Существует ли такой алгоритм на данный момент?
Какими критериями целесообразно пользоваться?    


Ответы

Ответ 1



Текстовый файл-это разновидность бинарного файла.Просто разный формат записи данных.Чтоб знать этот формат, нужно знать как этот файл записывался. После записи для считывающей программы он становится безликим набором байт. Однозначного стандарта не придумали. Есть попытки, типа расширений файлов, чтоб указать считывающей программе, как записывались данные. Но эти правила различаются в разных ОС. Можно попробовать так же, как и определяется кодировка документа - проанализировав контент. В случае с 8-битными кодировками это просто - смотреть наличия непечатных кодов символов. Для UTF-8 и иных композитных кодировок задача становится несколько сложнее.

Ответ 2



Благодарю всех откликнувшихся. В Linux есть команда file, посредством которой можно решить поставленную задачу. Есть ли аналог для Windows? Пробовал скачивать исходники и компилить, постоянно недостает некоторых заголовочных файлов. Fine Free File Command.

Ответ 3



Однозначно определить, конечно, невозможно, но в текстовом файле заведомо не будет таких символов, как #0 (нулевое значение байта). С другими непечатными символами сложнее: #13 и #10 -- это символы конца строки и возврата каретки. Я думаю, что оптимален будет такой алгоритм: Смотреть на нулевой символ. Смотрим на некоторые непечатные символы (но не все!). Смотрим на количество таких символов как пробел и конец строки + возврат каретки, их количество отличается от количества других символов. Тяжелая артиллерия. Смотрим на соотношение различных байтов, в достаточно больших бинарных файлов распределение приблизительно ровное, а в текстовых файлах, какие-то буквы будут встречаться чаще остальных. Если у вас не Юникод, то результаты применения должны быть очень хороши (~95%).

Комментариев нет:

Отправить комментарий