| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C++ Builder > Можно ли определить формат файла? |
| Автор: SerK 22.9.2009, 13:06 |
| Есть файл, можно ли определить текстовый это файл или нет? |
| Автор: mrbrooks 22.9.2009, 13:21 |
если не критично - то по расширению, если без расширения - то имхо никак - ибо прочитать ты можешь все - результат только будет нечитабельный. |
| Автор: Alca 22.9.2009, 14:36 | ||
SerK, что такое текстовый файл? Добавлено через 14 минут и 47 секунд http://ru.wikipedia.org/wiki/Текстовый_файл |
| Автор: Anikmar 23.9.2009, 15:31 |
| С большой долей вероятности файл, который разбит на порции не более 255 байт с символами 0d0a между порциями будет текстовым. Метод подходит только для ANSI |
| Автор: Данкинг 23.9.2009, 23:07 |
| А каким образом AkelPad определяет? Он же пишет при попытке открыть "файл бинарный, продолжить?". |
| Автор: t_gran 24.9.2009, 05:52 |
| В любом бинарном файле, хоть раз будет присутствовать, к примеру, 0x00 байт. А в текстовых файлах такого и быть не может. В результате, мы приходим к выводу, что тот же AkelPad должен проверять на наличие невидимых (управляющих) символов (байт), в результате чего он и делает вывод бинарный это файл или текстовый. P.S.: Объяснил топорно, но на мой взгляд так будет понятней. P.P.S.: Откройте любой текстовый файл в Hex редакторе и в середину воткните пустой байт. А затем откройте AckelPad-ом (с AckelPad не пробовал, у меня EmEditor - сразу сказал что это бинарный файл). |
| Автор: mrbrooks 24.9.2009, 07:41 | ||
надо посмотреть его исходники. Добавлено через 1 минуту и 14 секунд
это я правильно понял - что надо пропарсить сначала весь текст на наличие 0x00? |
| Автор: t_gran 24.9.2009, 09:00 | ||
Нет, конечно. P.S.: И не обязательно это должен быть 0x00 байт. |
| Автор: mrbrooks 24.9.2009, 09:06 | ||||
хочется увидеть пример, а не теорию камрад. вот к примеру дельфяцкие парни сделали так. реализация не совсем кошерная - но тем не менее:
|
| Автор: mrbrooks 24.9.2009, 09:31 | ||
думаю должно быть тогда что то вроде этого.
up. какие ваши предложения? |
| Автор: t_gran 24.9.2009, 10:06 | ||||
mrbrooks, видать у нас разные понятия о слове ПАРСЕР. А на счёт кода, вот, что я имел в виду:
Вызов:
Выводит текст если файл текстовый, иначе сообщает об этом. Естественно в пример воткнул проверку только на 0x00 байт. Кстати, mrbrooks, предыдущий пример, очень грамотен в плане загрузки блока в память, т.к. посимвольно считывать - это большие временные расходы. А вот сравнение лучше сделать по принципу хеширования, т.к. иначе на каждый символ придётся выполнять множество проверок, что в результате приведёт, опять же, к накладным временным расходам. P.S.: mrbrooks, +1. Приятно было по дискутировать. |
| Автор: mrbrooks 24.9.2009, 12:29 | ||
ну в эпоху dot.NET это уже не совсем актуально. Хотя конечно с TFileStream позволяет считать и во временный буфер. Проанализировать его - уже дело техники. Я же ратовал за сам подход, нежели реализацию. Согласный |
| Автор: SerK 25.9.2009, 13:09 |
| Друзья, спасибо всем за участие, но, к сожалению, я так и не понял, - как решить проблему определения текстового файла (если можно с кодом). P.s. Alca, текстовый файл это именно то, что указанно в вашей ссылке, а не файл с расширением .txt. |
| Автор: mrbrooks 25.9.2009, 13:11 |
| SerK, блин. мы же тебе написали решения. я и t_gran - выбирай и дорабатывай |
| Автор: Alca 25.9.2009, 13:40 |
| SerK, тебе что не ясен алгоритм? |
| Автор: t_gran 28.9.2009, 07:13 |
| SerK, блин, слов нет! Более детального объяснения, изложенного mrbrooks и мной, и быть не может. |
| Автор: SerK 6.10.2009, 11:45 |
| mrbrooks, t_gran, недосмотрел, времени было в обрез, поэтому и написал чушь. Спасибо, всем за помощь, - всем по плюсику. |