Найкоротший код нескінченного дискового вводу / виводу


49

(Просто відкрийте 50 вкладок у Google Chrome: D (просто жартую, ні, ви не можете))

Найкоротший код для нескінченного дискового вводу / виводу будь-якої мови, приклад C #:

using System.IO;

namespace FileApp {
    static class Program {
        public static void Main() {
            do {
                File.WriteAllText("a", "a");
                File.Delete("a");
            } while (true);
        }
    }
}

Однак ви не можете просто заповнити весь диск, тому що він врешті-решт зупиниться і буде кінцевим.

І ви не можете лише читати, нескінченне письмо має відбуватися. (Це повинно вбити мій SSD після достатнього часу виконання.)

Отримати тріщини! :)


6
Чи читання файлів замість їх запису також вважається дисковим введенням / виходом? Що з написанням /dev/null? (Чи yes>/dev/nullдійсна відповідь Баша?)
Дверна ручка

2
Чи можна взяти який-небудь вклад?
Користувач112638726

29
Бандито ... що твій SSD зробив тобі?
Р. Кап

2
Оскільки я не можу сподіватися конкурувати з 6-ти байтними рішеннями, чи створить файл ./a з вмістом 3-х байт ./a розраховуватиме на бонусний приз за латеральне мислення? AFAIK тільки виконання файлу викликає деяку файлову систему творчість мати місце у багатьох системах, тому що принаймні «останнього часу доступу» оновлюється в якості побічного продукту ;-)
Stilez

3
Багато з цих відповідей будуть записувати дані в один і той же простір знову і знову. Це не призводить до фактичного запису диска, навіть якщо дані відрізняються. (Надзвичайний випадок, дос -> зв’язок Windows. Я записав 4 к даних у дос і перечитав їх у Windows - доки дані протікали, дискове світло не вимикається.)
Лорен Печтел,

Відповіді:


26

DOS / Пакет: 4 байти

%0>x

Цей пакетний файл буде викликати себе ( %0) та перенаправляти ( >) вихід у файл, який називається x. Оскільки відлуння увімкнено за замовчуванням, це виведе шлях та команду.


Чи з часом цього не вистачить на диску, або вихід буде перезаписаний?
MathuSum Mut

1
@MathuSumMut: З >ним буде переписано. >>додасться
Томас Веллер

1
Ви виграєте тоді я здогадуюсь: P
MathuSum Mut

2
@ ΈρικΚωνσταντόπουλος: Це правда. У цьому випадку створюється файл з 0 байтом, не генеруючи введення-виведення, як очікувалося цим викликом. Але не наше завдання розглядати кожен випадок, інакше ви можете вимкнути кешування, сканери вірусів, ...
Томас Веллер

1
Запис файлу 0 байтів все ще спричинить введення / виведення диска, оскільки він повинен оновлювати час останнього змінення в каталозі.

48

PowerShell v2 +, 10 байт

for(){1>1}

Просто петлі нескінченно порожнім forциклом. Кожну ітерацію ми виводимо ціле число 1(неявно перетворене на рядок) з > оператором переадресації , який перезаписує файл, названий 1у локальному каталозі.


Чи можете ви замінити другий 1 чимось іншим (що означає дійсне ім'я файлу) або він повинен бути 1?
Нік Хартлі

1
У моєму Windows VM Winload.exeдостатньо ...
Комінтерн

Я думаю, що це повинно бути число, тому що якщо це літера, то вона буде розглядатися як змінна, трактувати її як необхідні лапки, і вони марнують байти. : P
MathuSum Mut

1
@QPaysTaxes MathuSum це правильно. Другий 1повинен бути чимось числом, щоб неявний синтаксичний аналіз правильно працював. Все, що [0-9]було б, працювало б так само.
AdmBorkBork

1
@Nacht Можливо, тоді це вигадка мого конкретного оточення. У моєму ISE (PSv4 Win8.1) заміна другого 1на що-небудь нечислове (і не вказане ні як, .\aні a.txtподібне) призводить до помилки розбору.
AdmBorkBork

28

Pyth, 6 байт

#.w]]0

Єдина команда виведення файлу Pyth .w. Коли викликається рядок, він записує цей рядок у файл у режимі додавання, що не корисно для цілей цього питання. При виклику у двовимірному масиві він записує відповідне зображення у цей файл, перезаписуючи вміст файлу. Ось що робить ця програма. Вихідне ім'я файлу за замовчуванням o.png, тож ця програма нескінченно перезаписує файл o.pngбілим зображенням у 1 піксель. #є нескінченною петлею.


27

Якщо ви хочете коротший (але більш нудний, ніж мій інший) відповідь:

Баш, 5 байт

>w;$0

Я міг би зробити це коротшим, якщо є команда (менше 3 байт), яка щось записує на диск I / O. Щось подібне syncпрацювало б, але syncце 4 байти 😛

Примітка: це не працює при запуску прямо з bash, лише тоді, коли його вводять у сценарій та виконують як ім'я сценарію. (тобто echo 'w>w;$0' > bomb; chmod 755 bomb; ./bomb)


1
Схоже, що між мною та @isaacg - хто перемагає?
Даніель

8
Я вважаю за краще використовувати exec(або . $0). Я думаю, що цього не вистачить.
муру

1
wТут потрібен перший ? Для мене просто >wстворюється порожній файл w, і робити це в циклі буде створювати нескінченний ввід / вивід, оскільки метадані mtime потрібно постійно оновлювати.
Геннінг Макгольм

1
Якщо це кваліфікується @HenningMakholm, тоді я поставлю це.
Даніель,

2
Сценарій містить лише ці байти. Оскільки це баш, компілятор чи щось фантазійне не потрібно.
Даніель

16

Рубін, 22 20 байт

loop{open(?a,?w)<<1}

Неодноразово скорочує і записує 1файл у файл a.

Дякую Вентеро за 2 байти!


3
open(?a,?w)<<1зберегти 2 байти.
Вентеро

Дякую, дверна ручка, що вшанували нас своєю присутністю. Я принижений.
MathuSum Mut

Це дескриптори файлів витоку? Або він закривається, коли виходить із сфери застосування? (ІДК Рубі, вибач).
Пітер Кордес

13

cmd, 14 байт

:a
cd>1
goto a

Нескінченно перезаписує файл 1з рядком у поточний каталог


Я тут новий: Чи вікна нових рядків ( CR LF) вважаються двома байтами?


13
Ласкаво просимо до PPCG! Windows, принаймні сучасні системи, повинні мати можливість працювати LFбез проблем. Вищезазначене працює для мене лише LFв Windows 8.1, тому ваші 14 байт є правильними.
AdmBorkBork

CR LF2 CR1 LF1
Ерік Атголфер

13

Bash + coreutils, 10

yes \>b|sh

Записує безперервний потік >b, який призначений shдля оцінки. >bпросто усікає файл, що викликається bнульовими байтами щоразу.


4
+1, оскільки ваше ім’я дійсно відповідає тому, що буде робити цей фрагмент коду
Олів'є Дулак

Чому bі ні c?
CalculatorFeline

9

Perl 5, 27 32 22 байт

{{open my$h,'>o'}redo}

Якщо достатньо просто зміни часової позначки файлу модифікації ...

Швидке пояснення:

{ # Braces implicitly create/mark a loop.
    { # They also create closures, for `my` variables.
        open my $filehandle, '>', 'o';    # Writing to file "o".
        # close $filehandle;   # Called implicitly when
                               # variable gets destroyed.
    } # $filehandle gets destroyed because there are no references to it.
    redo; # ...the loop.
}

Попереднє рішення (32 байти): {{open my$h,'>o';print$h 1}redo}

Редагувати: {open F,'O';print F 1;redo} ← Не перевіряли код перед публікацією; тепер мені довелося це виправити.


1
: oa змінна perl, без префіксу $!
кіт

@cat: Це не звичайна змінна, як скаляр, масив чи хеш. Це просто босворд. Залежно від контексту, барево може бути сприйнято як підменю (функцію), глобус, я думаю, або файлову ручку. (Може, й інші?)
g4v3

8

PHP, 60 30 17 16 15 байт

Оновлено ще раз відповідно до запропонованого @manatwork:

while(!`cd>1`);

Також зараз тестується.


Трохи обману 22 байти:

while (exec ('> 1 dir'));

Рання пропозиція від @manatwork 30 байт:

while (file_put_contents (1,1));

НЕ ТЕСТОВАНО (на цьому комп’ютері немає php) 43 байти:

for ($ a = fopen (1, 'w'); fputs ($ a, 1); fclose ($ a))

Гольф оригінальний 45 байт:

$ a = fopen (1, 'w'); while (fputs ($ a, 1)) перемотування назад ($ a);

До моєї першої публікації тут приєднався, тому що я просто мусив це спробувати: доки успішне записування файлу - перезапустити вказівник на файл, щоб почати.


Просто не можна отримати менше, ніж file_put_contents ().


5
while(file_put_contents(1,1));повинно вистачити Зауважте, що запуск повних скриптів з командного рядка php -r '…'є прийнятним відповідно до консенсусу щодо мета- запуску PHP з -rзамість кодових тегів .
манатство

Це насправді запис на диск чи просто буфер в пам'яті?
Бріс М. Демпсі

1
@manatwork О людино! Я знав, що завжди є можливість для вдосконалення, але так багато ... шкода, що ця функція не має коротшої назви. : DI не знаю про буфер. Цікаво, чи варто мені оновити відповідь тим коротшим рішенням.
діневала

2
Якщо вона коротша, будь ласка, оновіть свою відповідь, продовжуйте! :)
MathuSum Mut

Чи дозволено викликати exec () з php? Я усвідомлюю, що це більше не в "області" php.
діневала

7

ш, 11 байт

w>w;exec $0

Збережіть це у файлі без спеціальних символів, таких як loop.sh, зробіть його виконуваним і запустіть його з ./loop.shподібним або подібним.

Це записує вихід команди wв файл w, переписуючи попереднє значення кожного разу. Потім він замінює себе новою версією тієї самої програми, тож може працювати нескінченно.


цього не вистачає ні секунди >. Крім того, якщо у вас є "спеціальна" $PATHта "спеціальна" umask / файлова система, ви можете піти на це w>>w;$0, додавши її до 7 символів
mnagel,

@mnagel додається >>, він з часом заповнить диск
кішка

1
@mnagel, але ти маєш рацію про те, що не потребуєш exec, я цього не усвідомлював. Хтось ще це зробив, тому я не буду оновлювати
isaacg

3
Або . $0замість exec $0, можливо? Я не знаю, чи це призведе до переповнення стека чи чогось, хоча. ... Так, це загрожувало.
муру

7

C, 95 94 93 89 78 90 89 76 75 байт

#include<stdio.h>
main(){for(FILE*f=fopen("a","w");;fputc(0,f),fclose(f));}   

Знову ж таки, sudo watch -n1 lsof -p `pidof inf`здається, це справедливо.

ЯК Я НЕ ВІДПОВІДУЮТЬ ТАКІЙ ПРОСТІР D: <

Дякую @Jens за гоління 13 байт: D


1
w+Режим читання і запису, спочатку усічення файл. Оскільки вам не потрібно читати, ви можете голити байт за допомогою просто w, який також усікає файл, але не відкриває файл у режимі читання.
Mego

1
Немає необхідності, return 0;якщо цикл ніколи не припиняється.
Єнс

1
Чому б не використати fputc(1,f)замість супервертослова fprintf(f," ")?
Єнс

1
main(){for(FILE*f=fopen("a","w");;fputc(1,f),fclose(f));}оскільки порожній умовний у forзасобах true. 76 байт.
Єнс

1
@PeterCordes PPCG не є переповненням стека; будь ласка, не вносити змін до відповідей інших, які змінюють код або інші основні частини відповіді. Виправлення помилок друку чудово, але все, що потрібно (включаючи виправлення фактично неправильних тверджень), слід запропонувати в коментарях.
кіт

6

Баш, 26 байт

yes>y&while :;do rm y;done

Якби я розширив цю однолінійку, я отримав би це:

yes > y &      # Write out infinitely to the file y in the current directory
while true     # Let's do something forever
do             # Here's what we're going to do
    rm y       # delete y
done           # That's all we're going to do

Це не може точно конкурувати з 10-байтною лінією PowerShell, але вона буде мати власну проти інших. Дивіться іншу відповідь на 6-байтну версію.


2
while :;ls>l;done
Користувач112638726

1
Хороший старий execтрюк буде краще: ls>l;exec $0. Коротше, але нудно.
манатство

:>l;exec $0- створення файлу пише inode
user24582

7
Незважаючи на те, що ви видалили y, yesвін продовжуватиме записувати в ту саму ручку файлу, що і у нього. Біжи, lsof | grep yesі ти повинен побачити щось подібне /path/to/y (deleted). Це заповнить диск і вийде з ладу.
муру

4
Замість цього rm yви можете використовувати, >yякий буде усікати існуючий файл. Це також трохи коротше.
араґер

6

TI-BASIC, 12 байт

While 1
Archive A
UnArchive A
End

Альтернативне рішення користувача lirtosiast з однаковим розміром:

While 1
SetUpEditor
Archive ∟1
End

Це буде працювати на калькуляторах серії TI-83 + і TI-84 +.

Так, це також працює, якщо A вже заархівований або взагалі не ініціалізований на початку програми! У програмі лише 12 байт через токенізацію .


Я не знаю, чи вважається флеш-пам'ять, яка використовується калькуляторами, як "диск".
lirtosiast

1
@lirtosiast На захист Джеймі, накопичувачі SSD виготовлені з флеш-пам’яті =)
Cort Ammon

У будь-якому випадку кількість байтів принаймні на 10 байт менше. Другий екран Mem налічує заголовок, рівний 9 байтам + довжина назви програми, але ми цього не робимо, щоб ви могли відняти його.
lirtosiast

@lirtosiast Це неодноразово записує і читає в ПЗУ (постійну пам'ять) калькулятора, а не ОЗУ. Звичайно, калькулятори не мають
власного

@lirtosiast Спасибі, я про це не знав! (Мені було цікаво, чому кількість байтів, про які я повідомляв, TI-84 + не збігалася з моїм підрахунком рук ...) Я оновив свою відповідь.
Джеймі Махаб'є

6

CPython 3,5, 33 16 байт

while 1:open("a")

Так, насправді. : D


while 1:open("a","w")коротше і straceпоказує, що python робить відкриті, fstat64 і закриті, безумовно, операції вводу / виводу. Якщо файл aвже існує, він може бути ще коротшим:while 1:open('a') які до сих пір породжує open, fstat64і close, і навіть модифікує atimeфайл.
Радован Гарабік

@ RadovanGarabík: 0 Дякую, я не знав цієї зручної інформації! Звичайно, це конкретна реалізація.
кіт

5

MATL , 10 байт

`1[]T3$Z#T

Пояснення

Це нескінченний цикл, який записує номер 1 у файл, названий inoutу поточному каталозі, переписуючи вміст попереднього файлу.

`       % do...while loop
  1     %   push number 1
  []    %   push empty array
  T     %   push "true"
  3$Z#  %   fwrite function. First input is file content. Second is file name;
        %   defaults to "inout" if empty. Third indicates that any previous
        %   file contents should be discarded
  T     %   push "true": loop condition 
        % implicitly end loop. Loop condition is "true", so the loop is infinite

5

Haskell, 20 байт

f=writeFile"b""a">>f

Напишіть рядок "a" у файл з ім'ям "b"та повторіть. writeFileперезаписує файл, якщо він існує.


4

JavaScript (Node.js), 43 41 байт

(c=x=>require("fs").writeFile("a",x,c))()

Записується nullу файл з назвою a, а потім повторюється.


1
А що з написанням cабо xу файл? Економить 2 байти. Крім того, не require`fs`працює?
Чарлі

1
@Charlie Добрий момент з написанням cабо x. require`fs`на жаль, не працює, оскільки використання зворотних посилань для виклику функції викликає її з першими аргументами як ["fs"](масив, першим і єдиним елементом якого є передана рядок), а не "fs"(просто рядок). Спробуйте, console.log`test`наприклад.
Michał Perłakowski

4

ZSH, 14 байт

for ((;;)) :>:

Zsh, на відміну від Баша та інших подібних до Борна снарядів, дозволяє робити петлі без do ... doneогорожі умови, що умова належним чином обмежена.

Як варіант while:

while {} {:>:}

Зауважте, що :це вбудований. Ви не можете призупинити цю петлю.

Принцип такий самий, як і у відповіді Digital Trauma - у файл нічого не записується, IO - це лише створення та обрізка файлу.


Я повинен сказати, я ніколи не думав , що побачу Muru, в Muru, приходять грати в гольф код. Ласкаво просимо до PPCG: D
кіт

1
@cat Дякую : DI грали один раз раніше.
muru

3

Іржа, 84 байт

fn main(){loop{use std::io::Write;std::fs::File::create("a").unwrap().write(b"a");}}

File::create обрізає наявний файл, забезпечуючи, таким чином, у нас не вистачає місця на диску.

Використовуваний компілятор (1.9 вночі) видає попередження про невикористаний результат, write(...)але все ж компілюється.


3

C, 92 байти

#include <stdio.h>
main(){for(FILE*f=fopen("a","w+");fprintf(f," "),!fclose(f);;);return 0;}

Хоча це виглядає так, що ви можете зберегти 1 байт

  for(FILE*f=fopen("a","w+");fprintf(f," ")+fclose(f);;){}

проблема з цією петлею полягає в тому, що + не дає вам гарантованого замовлення.

Або рекурсивний - не повинен переповнюватися, якщо компілятор належним чином реалізує хвостову рекурсію (f знаходиться в явній внутрішній області)

85 байт

#include <stdio.h>
main(){{FILE*f=fopen("a","w+");fprintf(f," ");fclose(f);}main();}

Сподіваємось, 85-байтна версія не роздуває стек. : P
MathuSum Mut

2
@MathuSumMut: Просте виправлення: вимагає компіляції з оптимізаціями. Рекурсія виклику хвоста економить день.
Джошуа

1
Тут є багато можливостей для збереження байтів. Дивіться мою відповідь щодо упаковки матеріалів всередині for(;;)та коротших функцій, ніж fprintf. Якщо вам потрібно було включити stdio.h (який у вас немає), вам не знадобиться пробіл:#include<stdio.h>
Пітер Кордес

3

Математика, 14 байт

For[,1>0,a>>a]

Неодноразово записує рядок "a"у файл, названий aу поточному каталозі, створюючи його, якщо його не існує.


чи написав би рядок "a" або вміст змінної a? І якби останнє, що було б робити, якби ця змінна ще не була визначена?
Майкл Стерн

@MichaelStern Він пише змінну a, яка не визначена, тому вона просто пише a\n.
LegionMammal978

3

C, 40 байт

main(){for(;;)write(open("a",1)," ",1);}

Однак, дескриптори файлів швидко закінчаться; це можна подолати за допомогою:

45 , 43 байти

main(f){for(f=open("a",1);;)write(f,"",1);}

Чому f не має типу в другій?
кіт

2
@cat В C (дуже стиль K&R) він за замовчуванням int.
edmz

1
gcc і clang не збирають другу версію. Навіть GNU C не дозволяє динамічну ініціалізацію статичної / глобальної змінної (виклик open()не є константою часу компіляції). Крім того, у нього не вистачить місця на диску, тому що немає lseek. Можливо, спробуйте utime("a","")в циклі, який буде постійно оновлювати ctime. (Ще потрібно openстворити файл відомого імені).
Пітер Кордес

@PeterCordes Ви маєте рацію, дякую, що вказали. Виправлено.
edmz

Досі не задовольняє вимогу ОП про те, щоб врешті-решт не заповнити диск, але, можливо, все-таки варто відповісти як відповідь. (Якщо ви не маєте ідеї краще, ніж закрити / повторно відкрити мою відповідь (O_TRUNC) у циклі.) Всупереч моєму попередньому коментарю, оновлення часових міток тільки зазвичай насправді не створює фактичного дискового вводу / виводу в Linux. Як, можливо, одне письмо за 24 години lazytime, як я вже сказав у своїй відповіді.
Пітер Кордес

3

C на amd64 Linux, 36 байт (тільки часова мітка), 52 49 байт (реальна дискова активність)

Я жорстко open(2)кодую прапори, тому це не переноситься для інших ABI. Linux на інших платформах, ймовірно, використовує те саме O_TRUNCі т.д., але інші POSIX ОС можуть не використовувати.

+4 байти, щоб передати правильний аргумент дозволу, щоб переконатися, що файл створений з доступом до запису власника, див. Нижче. (Це трапляється для роботи з gcc 5.2)

кілька портативний ANSI C, 38/51 байт (лише часова мітка), 52/67 байт (реальна активність диска)

На основі відповіді @ Cat, з підказкою від @Jens.

Перше число - це для реалізацій, де intможе містити FILE *fopen()зворотне значення, друге - якщо ми не можемо цього зробити. В Linux, купи купи містяться в 32 бітах адресного простору, тому він працює навіть без -m32або -mx32. (Декларування void*fopen();коротше #include <stdio.h>)


Тільки метадані вводу / виводу часових міток :

main(){for(;;)close(open("a",577));}   // Linux x86-64

//void*fopen();       // compile with -m32 or -mx32 or whatever, so an int holds a pointer.
main(){for(;;)fclose(fopen("a","w"));}

Написання байтів, фактично потрапляючи на диск на Linux 4.2.0 + XFS + lazytime:

main(){for(;write(open("a",577),"",1);close(3));}

writeє умовою for-циклу, що добре, оскільки вона завжди повертає 1. closeце приріст.

// semi-portable: storing a FILE* in an int.  Works on many systems
main(f){for(;f=fopen("a","w");fclose(f))fputc(0,f);}                 // 52 bytes

// Should be highly portable, except to systems that require prototypes for all functions.
void*f,*fopen();main(){for(;f=fopen("a","w");fclose(f))fputc(0,f);}   // 67 bytes

Пояснення не портативної версії:

Файл створюється з випадковими дозволами сміття. З gcc5.2, з -O0або -O3, трапляється включити дозвіл на запис власника, але це не гарантується. 0666- десятковий 438. Третій аргумент openзайме ще 4 байти . Ми вже жорстко кодуємо O_TRUNC і так далі, але це може зламатися з іншим компілятором або libc на тому ж ABI.

Ми не можемо опустити другий аргумент open, тому що значення сміття включає O_EXCL, і O_TRUNC|O_APPEND, таким чином, відкриті не вдається EINVAL.


Нам не потрібно зберігати повернене значення від open(). Ми припускаємо, що так 3, тому що це завжди буде. Навіть якщо ми почнемо з fd 3 open, він буде закритий після першої ітерації. Найгірше - він openвідкриває нові FDS, поки 3 не буде останнім доступним дескриптором файлів. Отже, до перших 65531 write()дзвінків може не вдатися EBADF, але тоді вони працюватимуть нормально при кожному openстворенні fd = 3.

577 = 0x241 = O_WRONLY|O_CREAT|O_TRUNCв Linux x86-64. Без цього O_TRUNC, час модифікації inode та час зміни не оновлюються, тому коротший аргумент неможливий. O_TRUNCє все ще важливим для версії, яка дзвонитьwrite виробляти фактичну активність диска, а не переписувати на місці.

Я бачу деякі відповіді на це open("a",1). O_CREAT потрібен, якщо aвін ще не існує. O_CREATвизначається як восьмеричний 0100 (64, 0x40) в Linux.


Жоден ресурс не протікає, тому він може працювати назавжди. straceвихід:

open("a", O_WRONLY|O_CREAT|O_TRUNC, 03777762713526650) = 3
close(3)                                = 0
... repeating

або

open("a", O_WRONLY|O_CREAT|O_TRUNC, 01) = 3
write(3, "\0", 1)                       = 1   # This is the terminating 0 byte in the empty string we pass to write(2)
close(3)                                = 0

Я отримав десяткове значення openпрапорців для цього ABI, використовуючи strace -eraw=openмою версію C ++.

У файловій системі з lazytimeувімкненою опцією кріплення Linux зміна, яка впливає лише на часові позначки inode, спричинить лише одне записування протягом 24 годин. Якщо ця опція монтажу відключена, оновлення часових позначок може бути корисним способом зносу вашого SSD. (Однак кілька інших відповідей мають лише метадані I / O).


альтернативи:

коротший непрацюючий :

main(){for(;;)close(write(open("a",577),"",3));}використовує writeповернене значення для передачі 3аргументу на закриття. Він зберігає інший байт, але не працює з gcc -O0 або -O3 на amd64. Сміття в третьому аргументі openвідрізняється, і не містить дозволу на запис. aстворюється вперше, але майбутні ітерації не вдається -EACCESS.

довше, працюючи, з різними системними дзвінками :

main(c){for(open("a",65);pwrite(3,"",1);)sync();} переписує байт на місці і дзвонить sync() синхронізувати всі файлові системи в масштабах усієї системи. Це засвічує світло приводу.

Нам не байдуже, який байт, тому ми не передаємо четвертий аргумент у pwrite. Так, для розріджених файлів:

$ ll -s a
300K -rwx-wx--- 1 peter peter 128T May 15 11:43 a

Написання одного байта зі зміщенням ~ 128TiB призвело до xfs, використовуючи простір 300кіБ для зберігання карти масштабу, я думаю. Не спробуйте це в OS X з HFS +: IIRC, HFS + не підтримує розріджені файли, тому він заповнить диск.

XFS - це правильна 64-бітна файлова система, що підтримує окремі файли до 8 екбабайтів . тобто 2 ^ 63-1, максимальне значення off_tможе містити.

strace вихід:

open("a", O_WRONLY|O_CREAT, 03777711166007270) = 3
pwrite(3, "\0", 1, 139989929353760)     = 1
sync()                                  = 0
pwrite(3, "\0", 1, 139989929380071)     = 1
sync()                                  = 0
...

2

Ракетка, 46 байт

(do()(#f)(write-to-file'a"f"#:exists'replace))

1
Я думав відповісти в Ракетці, але ти перебив мене на це. : P
кіт

З цікавості ви знайшли коротшу відповідь?
Вінні

1

Коефіцієнт, 73 байти

USING: io.files io.encodings
[ 0 "a" utf8 set-file-contents ] [ t ] while

Встановлює вміст файлу на нульовий байт назавжди.


1

CBM BASIC 7,0, 9 байт

0dS"a":rU

Ця програма при запуску кілька разів зберігає себе на диску. Ось більш читана версія, яка не використовує BASIC скорочення ключових слів:

0 dsave "a" : run

1
Хоча у нього закінчується касетна стрічка? ;)
MathuSum Mut

1
@MathuSumMut що б це було0 SAVE "A" : RUN
roofcat

1

Пітон, 32 байти

while 1:open("a","w").write("b")

Зауважте, що якщо працювати на python 3, це призведе до нескінченної кількості попереджень. Крім того, FDS, ймовірно, не вистачить, якщо буде запущено в нерейтинговій реалізації.


Як і примітка, коротша відповідь існує без команди writeта "w"частини команди open.
Rɪᴋᴇʀ

1

Dyalog APL 15.0, 17 байт (неконкурентоспроможний)

(⊢⊣⊃⎕NPUT⊢)⍣≢'A'1

На даний момент Chrome відображає U + 2262 неправильно. Наведена вище лінія повинна виглядати так (⊢⊣⊃⎕NPUT⊢)⍣̸≡'A'1.

Це не конкурує, оскільки версія 15 ще не була випущена.

Відноситься до функції (⊢⊣⊃⎕NPUT⊢)на 'A'1доти , поки вхід змінюється (тобто ніколи):

⊢⊣⊃⎕NPUT⊢ є функціональним поїздом:

┌─┼───┐      
⊢ ⊣ ┌─┼─────┐
    ⊃ ⎕NPUT ⊢

Правий край повертається'A'1 немодифікованим; це (ім'я файлу, перезаписати прапор) буде правильним аргументом для 'PNPUT'.

'⊃' повертає перший елемент 'A'1( 'A'); це дані, які слід записати.

Потім ⎕NPUTзапускається і повідомляє, скільки байтів було записано (2 або 3 залежно від ОС); це стає правильним аргументом до .

Лівий край знову повертається 'A'1немодифікованим; це лівий аргумент до .

ігнорує правий аргумент і повертає лівий аргумент ( 'A'1), це стає новим значенням, яке подається .

Оскільки нове значення тотожне старому, операція продовжується (назавжди).



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