Перевірка файлу містить лише нульові байти


12

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

Я усвідомлюю, що це дуже проста проблема, і я думаю, що я міг би щось зламати, але я підозрюю, що повинен бути якийсь короткий і елегантний спосіб зробити це, і це дало мені ідею зробити вирішення проблеми.

Це , тому найкоротший код у байтах виграє. (Моє власне уподобання стосувалося б найшвидшого рішення, але це занадто залежить від впровадження ...)

Пов’язані запитання : Вставте файл із нулями

Мотивація . Це лише для того, щоб сказати, звідки виникла проблема, на випадок, коли вам це цікаво. Не потрібно її читати.

ISO-образи компакт-дисків та DVD-дисків, скопійовані з "dd" чи іншими засобами, часто закінчуються послідовністю марних блоків, що містять лише нульові байти. Стандартні методи видалення цих блоків відомі та прості (див. Https://unix.stackexchange.com/questions/74827/ ), але іноді вони можуть видаляти непотрібні корисні дані, оскільки носій може брехати про власний розмір. Тож я хочу перевірити, чи видалені блоки містять лише нульові байти. Видалення цих блоків важливо для визначення нормалізованої версії ISO-зображень.

Відповіді:


5

Pyth, 6 5 байт

!sCM'

Спробуйте в Інтернеті!

Бере ім’я файлу з STDIN, відкриває та зчитує файл, перетворює його у список ints (думаю, Python ord) sums список (поверне 0iff-файл усі нульові байти) та nots результат, роздруковуючи його.


Гей,

Це дуже схоже на загальне питання програмування. Вони належать до переповнення стека . Однак із коментарів під основним дописом я можу побачити, що це був не ваш намір. З цього приводу я відчуваю, що дискусія була надмірно ворожою з обох сторін, тому я вирішив підібрати слабкість і надати вам належний прийом PPCG!

Як правило, ми просимо, щоб будь-які виклики були спочатку розміщені в нашій пісочниці для належного зворотного зв'язку. Ви можете ознайомитись з поточними повідомленнями там, щоб побачити, який формат ми надаємо перевагу викликам. Спробуйте спробувати наступного разу!

Тільки в разі , якщо ми все неправильно зрозуміли і ви які шукають спільне рішення, ось рішення в Python 3:

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

1
Це не працюватиме із зображенням масштабу сірого, що складається лише з чорних пікселів (нулів), завдяки потужності '.
користувач202729

Крім того: OP вимагає приймати ім'я файлу як вхід, використовуючи аргумент командного рядка, і повертати як код статусу.
користувач202729

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

Attache , 24 байти

Zero@Max&0@Ords@FileRead

Спробуйте в Інтернеті!

Пояснення

Це композиція з 4-х функцій, що виконуються одна за одною:

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

OP вимагає повної програми, дзвінок з командного рядка, прийняття імені файлу як вхідного аргументу та повернення як код статусу. ( @_@)
користувач202729

Це не дає помилкового позитиву для порожнього файлу?
ngenisis

1
@ngenisis в початковій проблемі було зазначено наступне: "Це означає, що порожній файл вважається нормальним" - перевірте історію редагувань, здається, що певний користувач відредагував цю точку з питання.
Conor O'Brien

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

Мова Вольфрама (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

Хаскелл, 49 байт

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

Очевидно, якщо імпорт не включений, то це 26 байт.


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

Якщо це двійковий файл, ви не можете його використовувати readFile, що призведе до винятку, коли ви знайдете недійсну послідовність Unicode. Хороший момент щодо pointfree.
Ізаак Вайс

0

JavaScript (ES8), 52 байти

Приймає URL як аргумент і повертає обіцянку, яка вирішується, trueякщо файл не порожній і не містить нульових байтів.

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

0

Zsh , 35 байт

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

Спробуйте в Інтернеті! Виводи за допомогою коду виходу.

Читайте, розділіть на символи та порозрядно або кожну кодову точку разом.

Якщо файл порожній, тіло циклу ніколи не запускається, і цикл повертає правду. Якщо значення "фальшивої помилки" можна змінити, провідні !можна видалити для збереження в 2 байтах.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.