Bir dosyayı sıfırlarla doldurma


12

Bugünkü göreviniz mevcut bir dosyayı almak ve belirli bir boyuta ulaşana kadar sıfır eklemek olacaktır.

Geçerli dizindeki bir dosyanın adını fve birkaç bayt alan bir program veya işlev yazmalısınız b. Orijinal içeriğini korurken sonuna yeni değerler bayt olacak şekildef sıfır (ascii 0s değil boş bayt) yazmalısınız b.

fAdında yalnızca alfasayısal ascii bulunduğunu, üzerinde tam izinlere sahip olduğunuzu, başlangıçta bundan daha büyük olmadığını b, ancak daha büyük olabileceğini bve sonsuz boş disk alanı olduğunu varsayabilirsiniz .

Sen farz olmayabilir fnonempty olduğu veya zaten boş bayt içermediğini.

Yürütme bittikten sonra varolan diğer dosyalar değiştirilmemeli ve yeni dosyalar bulunmamalıdır.

Test Durumları

F içeriği | b | Sonuçta ortaya çıkan içerik
12345 | 10 | 1234500000
0 | 3 | 000
[boş] | 2 | 00
[boş] | 0 | [boş]
123 | 3 | 123

@totallyhuman başlangıçta dahab
larget

Dosyanın içeriğini değiştirilen içerikleri girdi olarak alabilir ve çıkarabilir miyiz?
Shaggy

Kütüphaneler kullanabilir miyiz?
Adám

1
@Phoenix Sorun şu ki Dennis kütüphaneyi uzaktaki bir klasöre koydu (benim seçimim değil). Arama yolunda varmış gibi sayabilir miyim?
Adám

Dosyanın zaten boş bayt içermeyeceğini varsayabilir miyiz?
Dom Hastings

Yanıtlar:


20

Bash + coreutils, 13

truncate -s$@

Komut satırından giriş - ilk parametre dosya boyutu ve ikincisi dosya adıdır.

Gönderen man truncate:

Bir DOSYA daha kısaysa, uzatılır ve uzatılmış kısım (delik) sıfır bayt olarak okunur.

Çevrimiçi deneyin .


1
Kesme de uzayabilir mi?
Adám

11
Bilen bir erkek gerçekten erkeksi bir erkeğin içinde.
Sihirli Ahtapot Urn

truncateSistem çağrısının başarısız olduğu bir FAT bölümünde çalışıp çalışmadığını merak ediyorum .
Matteo Italia

1
Aynı fikri benim uygulamam olurdu dd bs=1 of=$1 seek=$2<&-(görmezden gelinebilecek bir hata mesajı yazdırır). Seninki çok daha kısa. Güzel.
Hvd

@hvd yep dd muhtemelen bunu yapabilir düşündüm
Dijital Travma

4

Harika, 54 47 43 41 bayt

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

-6 manatwork'ün döngüyü kaldırma fikri sayesinde; Bu benim orijinal fikrimdi, neden işe yaramayacağını düşündüğümü bilmiyorum ve bir döngü seçti ... Kesinlikle işe yarıyor, sadece test ettim.

Ungolfed:

{
    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
Daha kısa döngüsiz olmaz mıydı? {a,b->c=new File(a);c<<('\0'*(b-c.size()))}
manatwork

@manatwork evet! Ve aslında bundan daha iyi olabilir.
Sihirli Ahtapot Urn

@manatwork nevermind, (c=new File(a))gerekli parantez nedeniyle aynı bayt .
Sihirli Ahtapot Urn

1
Parantezleri neden eklenecek değerin tamamına koyduğum hakkında hiçbir fikrim yok. Gerekli değil.
manatwork

@manatwork Groovy parantez konusunda oldukça mizaçlıdır, sizi suçlayamaz haha.
Sihirli Ahtapot Urn


3

Python 2 , 59 57 54 bayt

Chepner sayesinde -5 bayt

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

1
@totallyhuman \x00boş bir bayttır.
Pavel

1
@totallyhuman hayır, daha çok bir bayrak şeyine benziyor (kapalı dosyalarla etkileşime izin vermemek)
Rod

1
@ Rod Etkileşimi seviyorum! Şimdiye kadarki en iyi çocuk dostu interaktif oyun
caird coinheringaahing

\0Yerine kullanabilirsiniz \x00.
chepner

Daha sonra, overextending kesiliyor tarafından başka bir üç bayt kaydedebilirsiniz: def g(n,b):f=open(n,'a');f.write('\0'*b);f.truncate(b).
chepner

3

PHP, 66 bayt

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

Komut satırı bağımsız değişkenlerinden girdi alır; ile çalıştırın -nr.


Bu 55 bayt işe yarayabilir, ancak büyük olasılıkla çalışmaz:

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

2

Java (Oracle JRE), 55 bayt

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

Spesifikasyonlar setLength(int), eklenen baytların tanımsız olduğunu söylüyor, ancak pratik olarak Oracle JRE sadece 0baytı ekliyor (bu yüzden onu belirtmiştim).

Kaynak JVM tarafından otomatik olarak kapatılır, bu yüzden bunu kendimiz yapmamız gerekmez.

Ölçek

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 bayt

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

1ve 2bir AHK betiğindeki ilk iki parametredir.
FileGetSizevarsayılan olarak bayt olarak çalışır.
Heyecan verici değil, ama basit: Boyutu alın, istediğiniz boyuttan çıkarın ve o kadar sıfır ekleyin.


1

Perl 6 , 40 bayt

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

$^ave $^bişlevin parametreleridir - sırasıyla dosya adı ve uzunluk.


1

Python 2 , 68 bayt

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

Çevrimiçi deneyin! (Dosyanın içeriğini yazdırırken kod, görünürlük için boş baytları ASCII 0'larla değiştirir.)


1
Sanırım bu ASCII sıfır yazıyor ve boş bayt değil
Pavel

Ah ... sıfır kelimesi yanıltıcıydı ...
bütünüyle insan

Meydan okumada büyük harflerle yazıyor.
Pavel

Dizede değişmez bir \ x00 kullanabilir misiniz (çıkış sırası değil)?
CalculatorFeline

2
Gerçek bir boş bayt kullanamazsınız, ancak \0daha kısadır.
xnor

1

PowerShell, 69 bayt

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 ^

$fdosya $siçin, hedef boyut için .ps1 olarak kaydedin ve çalıştırın

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

Bu bir kabuk, bu yüzden >>çıkış yeniden yönlendirme ve ekleme ile 1 bayt ekleyen gerçekten küçük bir döngü olmalı , değil mi? Hayır, çünkü >>yalnızca UCS2-LE çok baytlı kodlama çıktısı verir , bu nedenle onunla bir dosyaya tek bir bayt eklemenin yolu yoktur .. PSv5.1 kullanmıyorsanız ve bunu değiştiremezseniz, ancak bu rekabetin çok uzun olmasını sağlar :

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

Belki bir .Net Framework yaklaşımı vardır? Olmalı, ama aslında herhangi bir bayt veya hata yazamam. Ama yine de daha uzun:

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

1

Mathematica 50 Bayt

İthalat ihracat

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

kullanım

%["test1", 5]

1

q, 29 bayt

Dosya adını biçim :/foo/bar.bazve uzunluk olarak bir tamsayı olarak alan işlev .

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

Misal:

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

1

C, 56 bayt

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

Program dosyanın boyutunu ve kaç bayt ekleneceğini bulur. Daha sonra dosya fs - bsonuna fazladan bayt ekler .


1
PPCG'ye hoş geldiniz! Bu bir kod golf mücadelesi, bu nedenle amacınız programınızı olabildiğince küçük hale getirmektir. Gereksiz boşlukları kaldırarak başlamalısınız.
Pavel

4
Ayrıca, programınız girişlerin zaten değerlerde saklandığını fve bbuna izin verilmediğini varsayar . Sen gerekir i / den olabilir sizin programa o dahil ARGVbir işleve, konsol girişini veya argümanlar.
Pavel

Teşekkür ederim, değişkenlerin önceden ayarlandığını düşündüm. Benim hatam.
Garhoogin

1

C #, 90 bayt

using System.IO;s=>n=>File.AppendAllText(s,new string('\0',(int)new FileInfo(s).Length-n))
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.