Проверка файла содержит только нулевые байты


12

Ваша цель - написать программу или функцию, которая принимает в качестве входных данных строку, представляющую путь к файлу, и выводит истинное значение, если этот файл не пустой и не содержит ненулевых байтов - т. Е. Все биты равны 0 - - и фальшивое значение в противном случае.

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

Это , поэтому выигрывает самый короткий код в байтах. (Мои собственные предпочтения будут заключаться в самом быстром решении, но это слишком зависит от реализации ...)

Смежные вопросы : дополни файл нулями

Мотивация : Это только для того, чтобы сказать, откуда возникла проблема, если вы заинтересованы. Вам не нужно читать это.

ISO-образы CD и DVD, скопированные с помощью «dd» или другими способами, часто заканчиваются последовательностью бесполезных блоков, содержащих только нулевые байты. Стандартные методы удаления этих блоков известны и просты (см. Https://unix.stackexchange.com/questions/74827/ ), но иногда они могут удалять ненулевые полезные данные, поскольку носитель может лгать о своем собственном размере. Поэтому я хочу проверить, что удаленные блоки содержат только нулевые байты. Удаление этих блоков важно для определения нормализованной версии ISO-образов.

Ответы:


5

Pyth, 6 5 байт

!sCM'

Попробуйте онлайн!

Принимает имя файла из STDIN, открывает и читает файл, преобразует его в список из ints (например, Python ord) sums списка (вернет, 0если файл содержит все нулевые байты) и notвыводит результат, распечатывая его.


Привет,

Это очень похоже на общий вопрос программирования. Они принадлежат переполнению стека . Однако из комментариев под основным постом я вижу, что это не было вашим намерением. Тем не менее, я чувствую, что обсуждение было излишне враждебным с обеих сторон, поэтому я решил устранить слабину и дать вам должный прием PPCG!

Как правило, мы просим, ​​чтобы любые проблемы были сначала отправлены в нашу песочницу для правильной обратной связи. Вы можете взглянуть на текущие материалы, чтобы увидеть, какой формат мы предпочитаем для испытаний. Пожалуйста, попробуйте в следующий раз!

Только в случае , если мы все неправильно поняли и вы которые ищут общее решение, вот решение в Python 3:

def main(string):
    with open(string) as file:
        return not any(map(ord,file.read()))

1
Это не будет работать с изображением в градациях серого, состоящим только из черных пикселей (нулей), из-за его мощности '.
user202729

Кроме того: OP требует ввода имени файла в качестве ввода с помощью аргумента командной строки и возврата в качестве кода состояния.
user202729

2

GNU sed -zn , 5 байтов

Входной файл передается в sed в качестве параметра командной строки. Выведите как стандартный код возврата оболочки - то есть 0 - ИСТИНА, 1 - ЛОЖЬ.

/./q1

Обычно sedработает на входных записях с разделителями новой строки (AKA "линии"). -zизменяет это на входные записи, разделенные нулями. Если какие-либо входные записи соответствуют .регулярному выражению, тогда используйте qкод выхода 1.

Попробуйте онлайн!


2

DOS, 37 байт


100:BE 80 00 MOV SI, 0080
103:AD       LODSW ;get command-line length
104:98       CBW ;only a byte
105:93       XCHG BX,AX
106:88 40 FF MOV [BX+SI-01], AL ;zero end of name
109:B4 3D    MOV AH, 3D
10B:89 F2    MOV DX, SI
10D:CD 21    INT 21 ;open file
10F:93       XCHG BX, AX ;handle into BX
110:AF       SCASW ;DI=0
111:B4 3F    MOV AH, 3F
113:B1 01    MOV CH, 01
115:CD 21    INT 21 ;read 1 byte
117:91       XCHG CX, AX
118:E3 06    JCXZ 0120 ;quit on EOF
11A:97       XCHG DI, AX ;set true for later
11B:38 2C    CMP [SI], CH
11D:74 F2    JZ 0111 ;loop while zero
11F:4F       DEC DI ;set false
120:97       XCHG DI, AX
121:B4 4C    MOV AH, 4C ;return
123:CD 21    INT 21

Он открывает файл с именем в командной строке, возвращает 0, если он пуст или содержит ненулевое значение, в противном случае возвращает 1.


1

Атташе , 24 байта

Zero@Max&0@Ords@FileRead

Попробуйте онлайн!

объяснение

Это композиция из 4 функций, выполняемых одна за другой:

  • FileRead - принимает имя файла в качестве входного, возвращает содержимое этого файла
  • Ords - возвращает кодовые точки ASCII каждого символа в списке
  • Max&0- это равносильно тому, для аргумента x, Max[x, 0]; это, в свою очередь, вычисляет максимум всех записей в xи 0(дает 0пустой список)
  • Zero - это предикат, который проверяет, действительно ли это число равно 0, и возвращает это логическое значение.

OP требует полной программы, вызова из командной строки, принятия имени файла в качестве ввода с использованием аргумента и возврата в качестве кода состояния. ( @_@)
user202729

Разве это не дает ложного срабатывания для пустого файла?
ngenisis

1
@ngenisis исходная проблема гласила следующее: «Это означает, что пустой файл считается нормальным» - проверьте историю изменений, кажется, что определенный пользователь отредактировал эту точку вне вопроса.
Конор О'Брайен

1

C (32-битная платформа), 65 байт

main(x,v)int*v;{for(v=fopen(v[1],"r");!(x=fgetc(v)););return++x;}

Предполагается, что размеры указателей одинаковы, что почти всегда верно. Возвращает с 0кодом завершения в случае успеха (файл содержит только NULсимволы), в противном случае используется другое значение.

Поведение не определено, если аргумент командной строки не является путем к читаемому файлу.


Я думаю, что вам нужно написать int**v? Я не могу найти компилятор, в котором это не происходит, не делая этого. Кроме того, вы можете немного сэкономить, преднамеренно ошибаясь , но я не знаю, является ли это лучшим подходом.
FryAmTheEggman

А? Я пробовал это с gcc на mingw32, работает без нареканий. Я, вероятно, должен добавить ограничение sizeof(void*) == sizeof(int)(или, в более общем случае, «32-битная платформа»), затем ... на amd64платформе, попробуйте скомпилировать с -m32;)
Феликс Пальмен,

@FryAmTheEggman также работает на TIO при компиляции в виде 32-битного кода ( -m32): попробуйте онлайн!
Феликс Пальмен,

Ах, конечно. Хорошая работа, тогда! Не стесняйтесь использовать мое предложение, чтобы сохранить пару байтов :)
FryAmTheEggman


0

Wolfram Language (Mathematica) , 30 байтов

BinaryReadList@#~MatchQ~{0..}&

Попробуйте онлайн!

объяснение

                             & (* Function which returns whether *)
BinaryReadList                 (* the list of bytes *)
              @                (* of *)
               #               (* the input *)
                ~MatchQ~       (* matches *)
                        {0..}  (* a list of a one or more zeros *)

Альтернативный раствор, 22 байта

Если предполагается, что пустые файлы проходят, это можно сократить до:

Tr@BinaryReadList@#<1&

Попробуйте онлайн!


0

Java, 149 байт

boolean b(String f)throws Exception{java.io.InputStream s=new java.io.FileInputStream(f);int i=Math.abs(s.read());while(i==0)i+=s.read();return i<0;}

0

Perl 5, 20 байт

$\=0;exit<>=~/^\0+$/

Принимает имя файла в аргументах командной строки и возвращает ответ в коде выхода программы


0

Python 3, 59 байт

f=lambda s:any(open(s,'rb').read())+not len(open(s).read())

Возвращает 0 для успеха (все байты ноль).

Возвращает 1 при ошибке (хотя бы один ненулевой байт или файл нулевой длины).


Если файл пуст, вы должны вернуть Failure.
Адам

0

APL (Dyalog Unicode) , 14 байтов

Полная программа. Запрашивает имя файла от stdin.

0=⌈/11 ¯1MAP

Попробуйте онлайн!

 запрос имени файла

11 ¯1⎕MAP сопоставить этот файл с упакованным битовым массивом

⌈/ максимум (уменьшение); наименьшее число с плавающей запятой, если оно пустое, в противном случае 0 или 1

0= ноль равен этому?


0

Haskell, 49 байтов

import Data.ByteString
f=(all(<1)<$>).getContents

Очевидно, что если импорт не включен, то это 26 байтов.


Я полагаю, вы имели в виду readFileвместо getContets. Я думаю, что вы можете прочитать файл как обычную строку, сравнить =='\0'(или лучше <'\1') и избавиться от import. Как вы можете использовать анонимную функцию, вы можете опускать f x=и идти pointfree: (all(<'\1')<$>).readFile.
Ними

Если это бинарный файл, вы не можете его использовать readFile, что вызовет исключение при обнаружении недопустимой последовательности Unicode. Хороший вопрос, касающийся очков.
Исаак Вайс

0

JavaScript (ES8), 52 байта

Принимает URL в качестве аргумента и возвращает обещание, которое разрешается, trueесли файл не пустой и не содержит нулевых байтов.

async p=>!/\0|^$/.test(await(await fetch(p)).text())

0

Зш , 35 байт

! for c (${(s::)"$(<$1)"})((i|=#c))

Попробуйте онлайн! Выходы через код выхода.

Чтение, разделение на символы и поразрядная или каждая кодовая точка вместе.

Если файл пуст, тело цикла никогда не запускается, поэтому цикл возвращает truey. Если значения истинности и ложности можно поменять местами, то начальное значение может !быть удалено для сохранения в 2 байта.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.