Mã ngắn nhất cho I / O đĩa vô hạn


49

(Chỉ cần mở 50 tab trong Google Chrome: D (đùa thôi, không bạn không thể))

Mã ngắn nhất cho I / O đĩa vô hạn bất kỳ ngôn ngữ nào, ví dụ C #:

using System.IO;

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

Mặc dù vậy, bạn không thể lấp đầy toàn bộ đĩa, vì cuối cùng nó sẽ dừng lại và sẽ là hữu hạn.

Và bạn không thể chỉ đọc, viết vô hạn phải xảy ra. (Nó phải giết SSD của tôi sau khi đủ thời gian chạy.)

Nhận được nứt! :)


6
Việc đọc các tập tin thay vì viết chúng cũng được tính là I / O đĩa? Viết về /dev/nullcái gì? ( yes>/dev/nullCâu trả lời của Bash có hợp lệ không?)
Doorknob

2
Nó có thể mất bất kỳ đầu vào?
Người dùng112638726

29
Dang man ... SSD của bạn đã làm gì với bạn?
R. Kap

2
Vì tôi không thể hy vọng cạnh tranh với các giải pháp 6 byte, nên việc tạo tệp ./a với nội dung 3 byte ./a được tính cho một giải thưởng cho tư duy bên? AFAIK chỉ thực thi một tệp khiến một số lần ghi hệ thống tệp diễn ra trên nhiều hệ thống, bởi vì ít nhất 'thời gian truy cập cuối cùng' được cập nhật dưới dạng sản phẩm phụ ;-)
Stilez

3
Nhiều câu trả lời trong số này sẽ ghi dữ liệu vào cùng một không gian lặp đi lặp lại. Điều đó không dẫn đến việc ghi đĩa thực tế ngay cả khi dữ liệu khác nhau. (Trường hợp cực đoan, dos -> giao tiếp với windows. Tôi đã viết 4k dữ liệu trong dos và đọc lại trong Windows - miễn là dữ liệu đang chảy thì đèn sẽ tắt.)
Loren Pechtel

Câu trả lời:


26

DOS / Batch: 4 byte

%0>x

Tệp bó này sẽ gọi chính nó ( %0) và chuyển hướng ( >) đầu ra đến một tệp được gọi x. Vì echo được bật theo mặc định, điều này sẽ xuất ra đường dẫn và lệnh.


Điều này cuối cùng sẽ hết dung lượng đĩa, hay đầu ra bị ghi đè?
MathuSum Mut

1
@MathuSumMut: Với >nó sẽ bị ghi đè. >>sẽ nối thêm
Thomas Weller

1
Bạn thắng rồi tôi đoán: P
MathuSum Mut

2
@ Έρ: Điều đó đúng. Trong trường hợp đó, một tệp có 0 byte được tạo ra, không tạo ra I / O như mong đợi của thử thách này. Nhưng đó không phải là nhiệm vụ của chúng tôi để xem xét mọi trường hợp, nếu không bạn có thể muốn tắt bộ nhớ đệm, trình quét vi-rút, ...
Thomas Weller

1
Viết một tệp 0 byte vẫn sẽ gây ra I / O đĩa, vì nó phải cập nhật thời gian sửa đổi lần cuối trong thư mục.

48

PowerShell v2 +, 10 byte

for(){1>1}

Đơn giản chỉ cần vòng lặp vô hạn với một forvòng lặp trống . Mỗi lần lặp, chúng ta xuất số nguyên 1(được chuyển đổi hoàn toàn thành một chuỗi) với > toán tử chuyển hướng , ghi đè lên tệp có tên 1trong thư mục cục bộ.


Bạn có thể thay thế 1 thứ hai bằng bất cứ thứ gì khác (làm cho tên tệp hợp lệ) hoặc nó phải là 1?
Nic Hartley

1
Trên máy ảo Windows của tôi, Winload.exelà đủ ...
Comitern

Tôi nghĩ rằng nó phải là một số bởi vì nếu nó là một chữ cái thì nó sẽ được coi là một biến, để coi nó như là một trích dẫn chuỗi được yêu cầu và chúng lãng phí byte. : P
MathuSum Mut

1
@QPaysTaxes MathuSum đã đúng. Thứ hai 1cần phải là một số loại để phân tích ngầm hoạt động chính xác. Bất cứ điều gì từ [0-9]sẽ làm việc như nhau.
admBorkBork

1
@ Du thuyền Có lẽ đó là một sự giải thích về môi trường cụ thể của tôi. Trong ISE của tôi (PSv4 Win8.1), việc thay thế thứ hai 1bằng bất kỳ thứ gì không phải là số (và không được chỉ định là .\ahoặc a.txthoặc tương tự) dẫn đến lỗi phân tích cú pháp.
admBorkBork

28

Bình thường, 6 byte

#.w]]0

Lệnh đầu ra tập tin duy nhất của Pyth là .w. Khi được gọi trên một chuỗi, nó ghi chuỗi đó vào một tệp ở chế độ chắp thêm, điều này không tốt cho mục đích của câu hỏi này. Khi được gọi trên mảng 2-d, nó ghi hình ảnh tương ứng vào tệp đó, ghi đè lên nội dung tệp. Đó là những gì chương trình này làm. Tên đầu ra của tệp mặc định là o.png, vì vậy chương trình này sẽ ghi đè lên tệp o.pngmột hình ảnh trắng 1 pixel. #là một vòng lặp vô hạn.


27

Nếu bạn muốn một câu trả lời ngắn hơn (nhưng nhàm chán hơn câu trả lời khác của tôi):

Bash, 5 byte

>w;$0

Tôi có thể làm cho nó ngắn hơn nếu có một lệnh (dài dưới 3 byte) ghi một cái gì đó vào đĩa I / O. Một cái gì đó giống như syncsẽ hoạt động, nhưng synclà 4 byte

Lưu ý: điều này không hoạt động khi chạy trực tiếp từ bash, chỉ khi được đặt trong một tập lệnh và chạy như tên tập lệnh. (tức là echo 'w>w;$0' > bomb; chmod 755 bomb; ./bomb)


1
Có vẻ như đó là một sự ràng buộc giữa tôi và @isaacg - ai thắng?
Daniel

8
Tôi thích sử dụng exec(hoặc . $0). Tôi nghĩ rằng điều này sẽ hết PID.
muru

1
Là đầu tiên wcần thiết ở đây? Đối với tôi chỉ đơn giản là >wtạo một tệp trống wvà thực hiện điều đó trong một vòng lặp sẽ tạo ra I / O vô hạn vì siêu dữ liệu mtime cần được cập nhật liên tục.
Henning Makholm

1
Nếu điều đó đủ điều kiện @HenningMakholm thì tôi sẽ đưa nó vào.
Daniel

2
Kịch bản chỉ chứa các byte này. Vì nó không có trình biên dịch hay bất cứ thứ gì cần thiết.
Daniel

16

Ruby, 22 20 byte

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

Liên tục cắt ngắn và ghi a 1vào tập tin a.

Cảm ơn Ventero cho 2 byte!


3
open(?a,?w)<<1để lưu 2 byte.
Ventero

Cảm ơn bạn, tay nắm cửa, vì đã tôn vinh chúng tôi với sự hiện diện của bạn. Tôi khiêm tốn mà.
MathuSum Mut

Có mô tả tập tin rò rỉ? Hay nó bị đóng cửa khi đi ra khỏi phạm vi? (IDK Ruby, xin lỗi).
Peter Cordes

13

cmd, 14 byte

:a
cd>1
goto a

Hoàn toàn ghi đè tập tin 1với chuỗi vào thư mục hiện tại


Tôi mới ở đây: Các cửa sổ mới dòng ( CR LF) có được tính là hai byte không?


13
Chào mừng đến với PPCG! Windows, ít nhất là các hệ thống hiện đại, có thể xử lý LFmà không gặp sự cố. Ở trên chỉ hoạt động với tôi LFtrên Windows 8.1, vì vậy 14 byte của bạn là chính xác.
admBorkBork


13

Bash + coreutils, 10

yes \>b|sh

Viết một dòng liên tục >b, được dẫn đến shđể đánh giá. >bchỉ cần cắt bớt một tệp được gọi là b0 byte mỗi lần.


4
+1 vì tên của bạn thực sự phù hợp với những gì đoạn mã này sẽ làm
Olivier Dulac

Tại sao bvà không c?
Máy

9

Perl 5, 27 32 22 byte

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

Nếu chỉ đơn giản là thay đổi dấu thời gian sửa đổi của tệp thì đủ ...

Giải thích nhanh:

{ # 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.
}

Giải pháp trước đó (32 byte): {{open my$h,'>o';print$h 1}redo}

Chỉnh sửa: {open F,'O';print F 1;redo} ← Không kiểm tra mã trước khi đăng; bây giờ tôi phải sửa nó


1
: oa perl biến không có tiền tố với $!
con mèo

@cat: Đây không phải là biến thông thường, như vô hướng, mảng hoặc hàm băm. Nó chỉ đơn giản là một bareword. Tùy thuộc vào ngữ cảnh, một bareword có thể được coi là một phụ (một chức năng), một quả địa cầu, tôi nghĩ hoặc một tập tin. (Có lẽ những người khác cũng vậy?)
g4v3

8

PHP, 60 30 17 16 15 byte

Đã cập nhật một lần nữa theo @manatwork đề xuất:

while(!`cd>1`);

Hiện tại cũng đã thử nghiệm.


Một chút gian lận 22 byte:

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

Đề xuất trước đó bởi @manatwork 30 byte:

while (file_put_contents (1,1));

KHÔNG KIỂM TRA (không có php trên máy tính này) 43 byte:

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

Bản gốc 45 byte được đánh gôn:

$ a = fopen (1, 'w'); while (fputs ($ a, 1)) tua lại ($ a);

Bài đăng đầu tiên của tôi ở đây, đã tham gia vì tôi chỉ phải thử điều này: miễn là ghi tệp thành công, tua lại con trỏ tệp để bắt đầu.


Chỉ không thể nhỏ hơn file_put_contents ().


5
while(file_put_contents(1,1));nên là đủ. Lưu ý rằng việc chạy các tập lệnh đầy đủ từ dòng lệnh php -r '…'có thể được chấp nhận theo sự đồng thuận về meta Chạy PHP -rthay vì các thẻ mã .
manatwork

Đây thực sự là ghi vào đĩa hay chỉ là một bộ đệm trong bộ nhớ?
Brice M. Dempsey

1
@manatwork Ôi trời! Tôi biết luôn có chỗ để cải tiến, nhưng điều đó ... quá tệ là chức năng đó không có tên ngắn hơn. : DI không biết về bộ đệm .. Tôi tự hỏi liệu tôi có nên cập nhật câu trả lời với giải pháp ngắn hơn đó không.
diynevala

2
Nếu nó ngắn hơn, xin vui lòng cập nhật câu trả lời của bạn, hãy tiếp tục! :)
MathuSum Mut

Có được phép gọi exec () từ php không? Tôi nhận ra rằng nó không còn trong "phạm vi" của php.
diynevala

7

sh, 11 byte

w>w;exec $0

Lưu tệp này vào một tệp không có các ký tự đặc biệt, chẳng hạn như loop.sh, làm cho nó có thể thực thi được và chạy nó với ./loop.shhoặc tương tự.

Điều này ghi đầu ra của lệnh wvào tệp w, ghi đè giá trị trước đó mỗi lần. Sau đó, nó thay thế chính nó bằng một phiên bản mới của cùng một chương trình, vì vậy nó có thể chạy vô tận.


này là mất tích trong một giây >. đồng thời, giả sử bạn có một $PATHhệ thống tập tin / tập tin "đặc biệt" và "đặc biệt", bạn có thể thực hiện w>>w;$0, đưa nó xuống còn 7 ký tự
mnagel

@mnagel >>là chắp thêm, cuối cùng nó sẽ lấp đầy đĩa
con mèo

1
@mnagel nhưng bạn nói đúng về việc không cần exec, tôi đã không nhận ra điều đó. Một số người khác đã làm điều đó, vì vậy tôi sẽ không cập nhật
isaacg

3
Hoặc . $0thay vì exec $0, có lẽ? Tôi không biết nếu điều đó sẽ chạy gây ra tràn ngăn xếp hoặc một cái gì đó, mặc dù. ... Đúng, nó bị lỗi.
muru

7

C, 95 94 93 89 78 90 89 76 75 byte

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

Một lần nữa, sudo watch -n1 lsof -p `pidof inf`dường như nói điều này là hợp lệ.

LÀM THẾ NÀO TÔI KHÔNG XEM R SPENG KHÔNG GIAN D: <

Cảm ơn @Jens đã cạo sạch 13 byte: D


1
Các w+chế độ được đọc và ghi, ban đầu cắt bỏ các tập tin. Vì bạn không cần đọc, bạn có thể tắt một byte chỉ w, nó cũng cắt bớt tệp, nhưng không mở tệp ở chế độ đọc.
Mego

1
Không cần return 0;nếu vòng lặp không bao giờ chấm dứt.
Jens

1
Tại sao không sử dụng fputc(1,f)thay vì siêu dài dòng fprintf(f," ")?
Jens

1
main(){for(FILE*f=fopen("a","w");;fputc(1,f),fclose(f));}kể từ khi có điều kiện trống trong forphương tiện true. 76 byte.
Jens

1
@PeterCordes PPCG không phải là Stack Overflow; xin vui lòng không chỉnh sửa câu trả lời của người khác mà thay đổi mã hoặc các phần chính khác của câu trả lời. Sửa lỗi Typo là tốt, nhưng bất cứ điều gì beyod (bao gồm sửa chữa các tuyên bố thực tế không chính xác) nên được đề xuất trong các ý kiến.
con mèo

6

Bash, 26 byte

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

Nếu tôi mở rộng lớp lót này, tôi sẽ nhận được:

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

Điều này không thể cạnh tranh chính xác với dòng PowerShell 10 byte, nhưng nó sẽ tự chống lại các dòng khác. Xem câu trả lời khác của tôi cho phiên bản 6 byte.


2
while :;ls>l;done
Người dùng112638726

1
Thủ execthuật cũ tốt sẽ làm tốt hơn : ls>l;exec $0. Ngắn hơn, nhưng nhàm chán.
manatwork

:>l;exec $0- tạo tập tin đang viết inode
user24582

7
Mặc dù bạn xóa y, yesvẫn sẽ tiếp tục ghi vào cùng một tệp xử lý mà nó đã có. Chạy lsof | grep yesvà bạn sẽ thấy một cái gì đó như /path/to/y (deleted). Điều này sẽ lấp đầy đĩa và thất bại.
muru

4
Thay vì rm ybạn có thể sử dụng >ysẽ cắt bớt tập tin hiện có. Nó cũng ngắn hơn một chút.
aragaer

6

TI-BASIC, 12 byte

While 1
Archive A
UnArchive A
End

Giải pháp thay thế bởi người dùng lirtosiast với cùng kích thước:

While 1
SetUpEditor
Archive ∟1
End

Điều này sẽ hoạt động trên loạt máy tính TI-83 + và TI-84 +.

Có, điều này cũng hoạt động nếu A đã được lưu trữ hoặc hoàn toàn không được khởi tạo khi bắt đầu chương trình! Chương trình chỉ có 12 byte vì mã thông báo .


Tôi không biết bộ nhớ flash được sử dụng bởi các máy tính có được tính là "đĩa" không.
lirtosiast

1
@lirtosiast Trong phòng thủ của Jamy, SSD được tạo từ bộ nhớ flash =)
Cort Ammon

Trong mọi trường hợp, số byte ít hơn 10 byte. Màn hình Mem thứ 2 đếm một tiêu đề bằng 9 byte + độ dài của tên chương trình, nhưng chúng tôi không ở đây để bạn có thể trừ nó ra.
lirtosiast

@lirtosiast Điều này liên tục ghi và đọc vào ROM (bộ nhớ vĩnh viễn) của máy tính, không phải RAM. Tất nhiên, máy tính không có ổ cứng thực sự bên trong :)
Jamy Mahabier

@lirtosiast Cảm ơn, tôi không biết về điều đó! (Tôi đã tự hỏi tại sao số byte mà TI-84 + của tôi báo cáo không khớp với việc đếm bằng tay của tôi ...) Tôi đã cập nhật câu trả lời của mình.
Jamy Mahabier

6

CPython 3.5, 33 16 byte

while 1:open("a")

Vâng thật đấy. :CƯỜI MỞ MIỆNG


while 1:open("a","w")ngắn hơn và stracecho thấy python đang thực hiện các thao tác mở, fstat64 và đóng, chắc chắn là I / O. Nếu file ađã tồn tại, nó có thể còn ngắn hơn: while 1:open('a')mà vẫn tạo ra một open, fstat64close, và sửa đổi, ngay cả atimecủa tập tin.
Radovan Garabík

@ RadovanGarabík: 0 Cảm ơn bạn, tôi không biết thông tin hữu ích đó! Tất nhiên, đó là việc thực hiện cụ thể.
con mèo

5

MATL , 10 byte

`1[]T3$Z#T

Giải trình

Đây là một vòng lặp vô hạn ghi số 1 vào một tệp được gọi inouttrong thư mục hiện tại, ghi đè lên nội dung của tệp trước đó.

`       % 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 byte

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

Viết chuỗi "a"vào một tệp có tên "b"và lặp lại. writeFileghi đè tập tin nếu nó tồn tại.


4

JavaScript (Node.js), 43 41 byte

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

Viết nullvào một tệp có tên a, sau đó lặp lại.


1
Điều gì về việc viết choặc xvào tập tin? Tiết kiệm 2 byte. Ngoài ra, không require`fs`làm việc?
Charlie

1
@Charlie Điểm tốt với văn bản chay x. require`fs`tiếc là không hoạt động, bởi vì sử dụng backticks để gọi một hàm gọi hàm đó với các đối số đầu tiên là ["fs"](mảng, phần tử đầu tiên và duy nhất là chuỗi đã truyền) thay vì "fs"(chỉ là chuỗi). Hãy thử console.log`test`ví dụ.
Michał Perłakowski

4

ZSH, 14 byte

for ((;;)) :>:

Zsh, không giống như Bash và các vỏ giống như Bourne khác, cho phép các vòng lặp không có do ... donehàng rào , với điều kiện là được phân định phù hợp.

Ngoài ra, với while:

while {} {:>:}

Lưu ý rằng đó :là một nội dung. Bạn không thể tạm dừng vòng lặp này.

Nguyên tắc giống như trong câu trả lời của Digital Trauma - không có gì được ghi vào tệp, IO hoàn toàn từ việc tạo và cắt bớt tệp.


Tôi phải nói, tôi không bao giờ nghĩ rằng tôi muốn thấy muru, các muru, đi chơi Mã Golf. Chào mừng bạn đến với PPCG: D
mèo

1
@cat Cảm ơn. : DI đã chơi một lần trước đây.
muru

3

Rust, 84 byte

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

File::create cắt bớt một tập tin hiện có, do đó đảm bảo rằng chúng tôi không hết dung lượng đĩa.

Trình biên dịch đã sử dụng (1.9 Nightly) đưa ra cảnh báo về kết quả không được sử dụng write(...)nhưng vẫn biên dịch.


3

C, 92 byte

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

Mặc dù có vẻ như bạn có thể tiết kiệm 1 byte bằng cách

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

vấn đề với vòng lặp đó là + không cung cấp cho bạn thứ tự được bảo đảm.

Hoặc đệ quy - không nên tràn nếu trình biên dịch thực hiện đúng đệ quy đuôi (f nằm trong phạm vi bên trong rõ ràng)

85 byte

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

Hy vọng rằng phiên bản 85 byte không thổi tung ngăn xếp. : P
MathuSum Mut

2
@MathuSumMut: Khắc phục dễ dàng: yêu cầu biên dịch với tối ưu hóa. Đuôi đệ quy tiết kiệm trong ngày.
Joshua

1
Có rất nhiều phạm vi để lưu byte ở đây. Xem câu trả lời của tôi để đóng gói các thứ bên trong for(;;)và cho các chức năng ngắn hơn fprintf. Nếu bạn cần bao gồm stdio.h (mà bạn không cần), bạn không cần một khoảng #include<stdio.h>
trắng

3

Toán học, 14 byte

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

Liên tục ghi chuỗi "a"vào một tệp có tên atrong thư mục hiện tại, tạo nó nếu nó không tồn tại.


nó sẽ viết chuỗi "a" hay nội dung của biến a? Và nếu sau này, nó sẽ làm gì nếu biến đó chưa được xác định?
Michael Stern

@MichaelStern Nó viết biến a, không xác định, vì vậy nó chỉ ghi a\n.
LegionMammal978

3

C, 40 byte

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

Nó sẽ nhanh chóng hết các mô tả tập tin, mặc dù; điều này có thể được khắc phục với:

45 , 43 byte

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

Tại sao f không có loại thứ hai?
con mèo

2
@cat Trong C (kiểu K & R), nó mặc định là int.
edmz

1
gcc và clang sẽ không biên dịch phiên bản thứ 2. Ngay cả GNU C cũng không cho phép khởi tạo động một biến tĩnh / toàn cục (một lệnh gọi open()không phải là hằng số thời gian biên dịch). Ngoài ra, nó sẽ hết dung lượng đĩa, vì không có lseek. Có thể thử utime("a","")trong vòng lặp, sẽ tiếp tục cập nhật ctime. (Bạn vẫn phải opentạo một tệp có tên đã biết).
Peter Cordes

@PeterCordes Bạn nói đúng, cảm ơn vì đã chỉ ra. Đã sửa.
edmz

Cuối cùng vẫn không thỏa mãn yêu cầu của OP về việc không lấp đầy đĩa, nhưng có lẽ vẫn đáng để giữ lại như một câu trả lời. (Trừ khi bạn có ý tưởng tốt hơn câu trả lời gần / mở lại của tôi (O_TRUNC) trong vòng lặp.) Trái với nhận xét trước đây của tôi, cập nhật dấu thời gian thường không thực sự tạo ra I / O đĩa thực trên Linux. Giống như có thể một người viết mỗi 24 giờ với lazytime, như tôi đã nói trong câu trả lời của mình.
Peter Cordes

3

C trên amd64 Linux, 36 byte (chỉ dấu thời gian), 52 49 byte (hoạt động của đĩa thực)

Tôi mã hóa các open(2)cờ, vì vậy đây không phải là di động cho các ABI khác. Linux trên các nền tảng khác có thể sử dụng tương tự O_TRUNC, v.v., nhưng các HĐH POSIX khác thì không.

+4 byte để vượt qua một quyền chính xác arg để đảm bảo tệp được tạo với quyền truy cập ghi chủ sở hữu, xem bên dưới. (Điều này xảy ra để làm việc với gcc 5.2)

ANSI C hơi di động, 38/51 byte (chỉ dấu thời gian), 52/67 byte (hoạt động đĩa thực)

Dựa trên câu trả lời của @ Cat, với một mẹo từ @Jens.

Số đầu tiên dành cho việc triển khai trong đó giá trị trả về intcó thể giữ FILE *fopen(), số thứ hai nếu chúng ta không thể làm điều đó. Trên Linux, các địa chỉ heap xảy ra trong không gian địa chỉ 32 bit thấp, do đó, nó hoạt động ngay cả khi không có -m32hoặc -mx32. (Khai báo void*fopen();ngắn hơn #include <stdio.h>)


Chỉ có siêu dữ liệu dấu thời gian I / O :

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"));}

Viết một byte, thực sự nhấn đĩa trên Linux 4.2.0 + XFS + lazytime:

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

writelà điều kiện for-loop, điều này tốt vì nó luôn trả về 1. closelà mức tăng.

// 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

Giải thích về phiên bản không di động:

Các tập tin được tạo ra với quyền rác ngẫu nhiên. Với gcc5.2, với -O0hoặc -O3, nó bao gồm sự cho phép viết của chủ sở hữu, nhưng điều này không được đảm bảo. 0666là số thập phân 438. Một đối số thứ 3 opensẽ mất thêm 4 byte . Chúng tôi đã mã hóa O_TRUNC, v.v., nhưng điều này có thể phá vỡ với một trình biên dịch hoặc libc khác nhau trên cùng một ABI.

Chúng ta không thể bỏ qua đối số thứ 2 open, bởi vì giá trị rác xảy ra bao gồm O_EXCL, và O_TRUNC|O_APPENDdo đó, mở không thành công EINVAL.


Chúng tôi không cần phải lưu giá trị trả về từ open(). Chúng tôi cho rằng nó 3, bởi vì nó sẽ luôn luôn như vậy. Ngay cả khi chúng ta bắt đầu với fd 3 mở, nó sẽ bị đóng sau lần lặp đầu tiên. Trường hợp xấu nhất, opentiếp tục mở fds mới cho đến khi 3 là mô tả tệp có sẵn cuối cùng. Vì vậy, tối đa 65531 write()cuộc gọi đầu tiên có thể thất bại EBADF, nhưng sau đó sẽ hoạt động bình thường với mỗi lần opentạo fd = 3.

577 = 0x241 = O_WRONLY|O_CREAT|O_TRUNCtrên x86-64 Linux. Nếu không O_TRUNC, thời gian mod inode và thời gian thay đổi sẽ không được cập nhật, do đó không thể lập luận ngắn hơn. O_TRUNCvẫn là điều cần thiết cho phiên bản gọi writeđể tạo ra hoạt động đĩa thực tế, không phải viết lại tại chỗ.

Tôi thấy một số câu trả lời rằng open("a",1). O_CREAT là bắt buộc nếu akhông tồn tại. O_CREATđược định nghĩa là bát phân 0100 (64, 0x40) trên Linux.


Không có rò rỉ tài nguyên, vì vậy nó có thể chạy mãi mãi. straceđầu ra:

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

hoặc là

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

Tôi đã nhận được giá trị thập phân của các opencờ cho ABI này bằng strace -eraw=openphiên bản C ++ của mình.

Trên hệ thống tệp có lazytimebật tùy chọn gắn kết Linux , một thay đổi chỉ ảnh hưởng đến dấu thời gian inode sẽ chỉ gây ra một lần ghi trong 24 giờ. Với tùy chọn gắn kết bị tắt, cập nhật dấu thời gian có thể là một cách hữu hiệu để làm hao mòn ổ SSD của bạn. (Tuy nhiên, một số câu trả lời khác chỉ làm I / O siêu dữ liệu).


lựa chọn thay thế:

không làm việc ngắn hơn :

main(){for(;;)close(write(open("a",577),"",3));}sử dụng writegiá trị trả về để vượt qua một 3đối số để đóng. Nó lưu một byte khác, nhưng không hoạt động với gcc -O0 hoặc -O3 trên amd64. Rác trong đối số thứ 3 openlà khác nhau và không bao gồm quyền ghi. ađược tạo lần đầu tiên, nhưng tất cả các lần lặp lại trong tương lai đều thất bại -EACCESS.

lâu hơn, làm việc, với các cuộc gọi hệ thống khác nhau :

main(c){for(open("a",65);pwrite(3,"",1);)sync();} viết lại một byte tại chỗ và gọi sync()để đồng bộ hóa tất cả các hệ thống tập tin trên toàn hệ thống. Điều này giữ cho đèn ổ đĩa sáng lên.

Chúng tôi không quan tâm byte nào, vì vậy chúng tôi không chuyển arg thứ 4 sang pwrite. Yay cho các tập tin thưa thớt:

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

Viết một byte ở độ lệch ~ 128TiB đã dẫn đến xfs sử dụng 300kiB không gian để giữ bản đồ tỷ lệ, tôi đoán vậy. Đừng thử điều này trên OS X với HFS +: IIRC, HFS + không hỗ trợ các tệp thưa thớt, vì vậy nó sẽ lấp đầy đĩa.

XFS là một hệ thống tệp 64 bit thích hợp, hỗ trợ các tệp riêng lẻ lên tới 8 exabyte . tức là 2 ^ 63-1, giá trị tối đa off_tcó thể giữ.

strace đầu ra:

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

Vợt, 46 byte

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

1
Tôi đã nghĩ đến việc trả lời trong Vợt, nhưng bạn đã đánh bại tôi. : P
mèo

Vì tò mò, bạn đã tìm thấy một câu trả lời ngắn hơn?
Winny

1

Yếu tố, 73 byte

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

Đặt nội dung tệp thành byte nul mãi mãi.


1

CBM BASIC 7.0, 9 byte

0dS"a":rU

Chương trình này, khi chạy, liên tục lưu chính nó vào đĩa. Đây là phiên bản dễ đọc hơn, không sử dụng từ viết tắt BASIC:

0 dsave "a" : run

1
Nó chạy ra khỏi băng cassette mặc dù? ;)
MathuSum Mut

1
@MathuSumMut đó sẽ là0 SAVE "A" : RUN
trần nhà

1

Python, 32 byte

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

Lưu ý rằng nếu chạy trên python 3, điều này sẽ tạo ra vô số cảnh báo. Ngoài ra, nó có thể sẽ hết fds nếu chạy trong một triển khai không tính toán.


Cũng như một ghi chú, một câu trả lời ngắn hơn tồn tại mà không có write"w"một phần của lệnh mở.
Rɪᴋᴇʀ

1

Dyalog APL 15.0, 17 byte (không cạnh tranh)

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

Chrome hiện hiển thị sai U + 2262. Các dòng trên sẽ như thế nào (⊢⊣⊃⎕NPUT⊢)⍣̸≡'A'1.

Điều này không cạnh tranh vì phiên bản 15 chưa được phát hành.

Áp dụng các chức năng (⊢⊣⊃⎕NPUT⊢)trên 'A'1cho đến khi đầu vào thay đổi (tức là không bao giờ):

⊢⊣⊃⎕NPUT⊢ là một chức năng đào tạo:

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

Lợi nhuận ngoài cùng bên phải 'A'1không thay đổi; này (tên tệp, cờ ghi đè) sẽ là đối số phù hợp với `⎕NPUT '.

'⊃' trả về phần tử đầu tiên của 'A'1( 'A'); đây là dữ liệu được viết

Sau đó ⎕NPUTđược chạy và báo cáo có bao nhiêu byte được viết (2 hoặc 3 tùy thuộc vào HĐH); Điều này trở thành đối số đúng cho .

Phần ngoài cùng bên trái một lần nữa trả về 'A'1không thay đổi; đây là đối số trái với .

bỏ qua đối số bên phải của nó và trả về đối số bên trái ( 'A'1), điều này trở thành giá trị mới được cung cấp cho .

Vì giá trị mới giống hệt với giá trị cũ, hoạt động được tiếp tục (mãi mãi).



0

soạn thảo văn bản vim, 10 byte

qa:w<enter>@aq@a

8 byte nếu bạn không thể thực hiện lệnh thực thi @a

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.