파일을 0으로 채 웁니다


12

오늘해야 할 일은 기존 파일을 가져 와서 특정 크기에 도달 할 때까지 0을 추가하는 것입니다.

현재 디렉토리의 파일 이름 f과 바이트 수를 사용 하는 프로그램이나 함수를 작성해야합니다 b. 의 원래 내용을 유지하면서 새 크기가 바이트 가되도록 끝에 f0을 입력해야합니다 (아스키 0이 아닌 null 바이트)b .

당신은 가정 수 f는 처음보다 더 큰 것을 당신이 그것을 완전한 권한이 있는지, 단지 이름에 숫자 아스키를 가지고 b있지만, 큰으로 할 수있다 b, 무한 디스크 여유 공간이 있음.

f비어 있지 않거나 이미 널 바이트를 포함하지 않았다고 가정 할 수 없습니다 .

다른 기존 파일은 수정하지 않아야하며 실행이 끝난 후 새 파일이 없어야합니다.

테스트 사례

f의 내용 | b | f의 결과 내용
12345 | 10 | 1234500000
0 | 3 | 000
[빈] | 2 | 00
[빈] | 0 | [빈]
123 | 3 | 123

@totallyhuman 처음에는 크지 않습니다b
Adám

파일 내용을 입력으로 받아 수정 된 내용을 출력 할 수 있습니까?
얽히고 설킨

라이브러리를 사용할 수 있습니까?
Adám

1
@Phoenix 문제는 Dennis가 라이브러리를 멀리 떨어진 폴더에 넣었다는 것입니다 (내 선택은 아님). 검색 경로에서 사용 가능한 것처럼 계산할 수 있습니까?
Adám

파일에 아직 널 바이트가 포함되어 있지 않다고 가정 할 수 있습니까?
Dom Hastings

답변:


20

배쉬 + coreutils, 13

truncate -s$@

명령 행에서 입력-첫 번째 매개 변수는 파일 크기이고 두 번째 매개 변수는 파일 이름입니다.

보낸 사람 man truncate:

FILE이 짧으면 확장되고 확장 부분 (구멍)은 0 바이트로 읽습니다.

온라인으로 사용해보십시오 .


1
잘림도 확장 할 수 있습니까?
Adám

11
남자 다운 남자를 잘 아는 남자.
Magic Octopus Urn

truncatesyscall이 실패 하는 FAT 파티션에서 작동하는지 궁금 합니다.
Matteo Italia

1
동일한 아이디어를 구현했을 것입니다 dd bs=1 of=$1 seek=$2<&-(무시 할 수있는 오류 메시지가 표시됩니다). 당신은 훨씬 짧습니다. 좋은.
hvd

@ hvd yep 나는 dd가 아마 이것을 할 수 있다고 생각했다
Digital Trauma

4

그루비, 54 47 43 41 바이트

{a,b->(c=new File(a))<<'\0'*(b-c.size())}

루프를 제거하는 manatwork의 아이디어 덕분에 -6; 그게 내 원래의 아이디어 였는데 왜 그것이 작동하지 않고 루프를 선택했는지 알지 못했습니다 ... 확실히 작동하고 테스트했습니다.

언 골프 드 :

{
    a,b->                    // Two inputs: a is the File name, b is the desired size.
    File c = new File(a)     // Make and store the file.
    c << '\0'*(b-c.size())   // Append the difference between b and c.size() in nullbytes.
}
                             // Usually a close would be required, but, in Groovy,
                             // because private data isn't so protected, if a File
                             // Object goes out of scope, the attached Stream is 
                             // automatically flushed to disk.

1
루프리스가 더 짧지 않습니까? {a,b->c=new File(a);c<<('\0'*(b-c.size()))}
manatwork

@manatwork 예! 그리고 그것은 실제로 그것보다 더 나을 수 있습니다.
Magic Octopus Urn

@manatwork는 (c=new File(a))괄호가 필요 하기 때문에 동일한 바이트 수를 신경 쓰지 않습니다.
Magic Octopus Urn

1
추가 할 전체 값을 괄호로 묶은 이유를 모르겠습니다. 필요하지 않습니다.
manatwork

@manatwork Groovy는 괄호에 대해 매우 기질이 좋으며 하하를 비난 할 수 없습니다.
Magic Octopus Urn


3

파이썬 2 , 59 57 54 바이트

chepner 덕분에 -5 바이트

def g(n,b):f=open(n,'a');f.write('\0'*b);f.truncate(b)

1
@totallyhuman \x00은 널 바이트입니다.
Pavel

1
@totallyhuman 아니, 그것은 플래그 일과 비슷합니다 (닫힌 파일로 interactino를 허용하지 않음)
Rod

1
@Rod 나는 interactino를 좋아합니다! 지금까지 최고의 어린이 친화 대화 형 게임
케어 드 coinheringaahing

\0대신에 사용할 수 있습니다 \x00.
chepner 2016 년

초과 확장 한 다음 잘림으로써 다른 3 바이트를 저장할 수 있습니다 def g(n,b):f=open(n,'a');f.write('\0'*b);f.truncate(b).
chepner 2016 년

3

PHP, 66 바이트

for($p=fopen($f=$argv[1],a);filesize($f)<$argv[2];)fputs($p,"\0");

명령 행 인수에서 입력을받습니다. 로 실행하십시오 -nr.


이 55 바이트는 작동하지만 대부분 작동하지 않습니다.

fseek($p=fopen($argv[1],"w+"),$argv[2]);fputs($p,"\0");

2

자바 (Oracle JRE), 55 바이트

f->b->new java.io.RandomAccessFile(f,"rw").setLength(b)

사양에 setLength(int)따르면 추가 된 바이트는 정의되어 있지 않지만 실제로 Oracle JRE는 0바이트 만 추가합니다 (그래서 내가 지정한 이유).

리소스는 JVM에 의해 자동으로 닫히므로 직접 할 필요가 없습니다.

테스트

public class Pcg125661 {
  interface F {
    B f(String f);
  }
  interface B {
    void b(int b) throws java.io.IOException;
  }
  public static void main(String[] args) throws java.io.IOException {
    F a = f->b->new java.io.RandomAccessFile(f,"rw").setLength(b);
    a.f("a").b(100);
  }
}

1

AHK, 48 바이트

FileGetSize,s,%1%
2-=s
Loop,%2%
FileAppend,0,%1%

12AHK 스크립트의 처음 두 매개 변수입니다.
FileGetSize기본적으로 바이트 단위로 작동합니다.
흥미롭지는 않지만 간단합니다. 크기를 가져 와서 원하는 크기에서 빼고 0을 더하십시오.


1

펄 6 , 40 바이트

{$_=$^a.IO;.open(:a).put("\0"x($^b-.s))}

$^a그리고 $^b각각 파일 이름과 길이, - 함수에 매개 변수입니다.


1

파이썬 2 , 68 바이트

def g(f,b):
 with open(f,'r+')as c:c.write('\x00'*(b-len(c.read())))

온라인으로 사용해보십시오! (파일 내용을 인쇄 할 때 코드는 가시성을 위해 널 바이트를 ASCII 0으로 바꿉니다.)


1
나는 이것이 ASCII 바이트를 쓰지 않고 null 바이트가 아니라고 생각한다
Pavel

아 ... 단어 제로는 오해의 소지가되었다 ...
totallyhuman

글쎄, 그것은 도전 자체에 큰 글자로 말합니다.
Pavel

이스케이프 시퀀스가 ​​아닌 문자열에 리터럴 \ x00을 사용할 수 있습니까?
CalculatorFeline

2
리터럴 null 바이트는 사용할 수 없지만 \0더 짧습니다.
xnor

1

PowerShell, 69 바이트

param($f,$s)@(gc $f -en by)+,[byte]0*($s-(gi $f).length)|sc $f -en by
#     ^ filename
#        ^desired size
#                 ^ get content as byte stream
#           ^force it to an array even if there's 0 or 1 byte
#                          ^append a byte array of nulls..
#                                       ^..desired size - file size
#                            write to file with -encoding byte ^

$f파일, $s대상 크기의 경우 .ps1로 저장하고 실행

.\Add-NullBytesToFile.ps1 .\test.txt 10

쉘이므로 >>출력 리디렉션과 추가로 1 바이트를 추가하는 실제로 작은 루프가 있어야 합니까? 글쎄, 아니요, >>UCS2-LE 멀티 바이트 인코딩 만 출력 하기 때문에 파일에 단일 바이트를 추가 할 수있는 방법이 없습니다. :

$PSDefaultParameterValues['Out-File:Encoding']='utf8';while((gi $f).length-lt$c){[byte]0>>$f}

.Net Framework 접근 방식이 있습니까? 있어야하지만 실제로 바이트 또는 오류를 쓰도록 만들 수는 없습니다. 그러나 어쨌든 더 길다.

param($f,$s)[io.file]::WriteAllBytes($f,[byte[]](,0)*($c-(gi $f).length), $True)

1

Mathematica 50 바이트

수입 수출

Export[#,Import[#,c="Byte"]~Join~Table[0,{#2}],c]&

용법

%["test1", 5]

1

q, 29 바이트

형식 :/foo/bar.baz과 길이의 파일 이름을 정수로받는 함수입니다 .

{hopen[x](0|y-hcount x)#0x00}

예:

{hopen[x](0|y-hcount x)#0x00}[`:test.txt;100]

1

C, 56 바이트

fseek(f,0,2);int i;for(;ftell(f)<b;)putc(0,f);fclose(f);

프로그램은 파일의 크기와 추가 할 바이트 수를 찾습니다. 그런 다음 파일 fs - b은 끝에 추가 바이트를 추가합니다.


1
PPCG에 오신 것을 환영합니다! 이는 코드 골프 과제이므로 프로그램을 최대한 작게 만드는 것이 목표입니다. 불필요한 공백을 제거하여 시작해야합니다.
Pavel

4
또한 프로그램은 입력이 이미 값 f과에 저장되어 있으며 b허용되지 않는 것으로 가정합니다 . 당신은 있어야합니다 I /에서 할 수있는 프로그램에 O를 포함 ARGV하는 기능으로, 콘솔 입력, 또는 인수를.
Pavel

감사합니다. 변수가 이미 설정된 것으로 가정했습니다. 내 잘못이야.
Garhoogin

1

C #, 90 바이트

using System.IO;s=>n=>File.AppendAllText(s,new string('\0',(int)new FileInfo(s).Length-n))
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.