Pad file dengan nol

12

Tugas Anda hari ini adalah mengambil file yang ada dan menambahkan angka nol hingga mencapai ukuran tertentu.

Anda harus menulis sebuah program atau fungsi yang mengambil nama file di direktori saat ini fdan sejumlah byte b. Sambil mempertahankan konten asli f, Anda harus menulis nol (nol byte, bukan ascii 0s) hingga akhir sehingga ukuran barunya adalah bbyte.

Anda dapat berasumsi bahwa fhanya memiliki ascii alfanumerik dalam namanya, bahwa Anda memiliki izin penuh atasnya, yang awalnya tidak lebih besar dari b, tetapi mungkin sebesar b, dan bahwa ada ruang disk bebas tanpa batas.

Anda mungkin tidak menganggap fitu kosong, atau belum mengandung byte nol.

File lain yang sudah ada tidak boleh dimodifikasi dan file baru tidak boleh ada setelah eksekusi berakhir.

Uji Kasus

Isi dari f | b | Konten yang dihasilkan f
12345 | 10 | 1234500000
0 | 3 | 000
[kosong] | 2 | 00
[kosong] | 0 | [kosong]
123 | 3 | 123
Pavel
sumber
@totallyhuman itu awalnya tidak lebih besar darib
Adám
Bisakah kita mengambil konten file sebagai input dan output konten yang dimodifikasi?
Shaggy
Bisakah kita menggunakan perpustakaan?
Adám
1
@Phoenix Masalahnya adalah bahwa Dennis meletakkan perpustakaan di folder yang jauh (bukan pilihan saya). Dapatkah saya menghitung seolah-olah itu tersedia di jalur pencarian?
Adám
Bisakah kita menganggap file tersebut belum mengandung null byte?
Dom Hastings

Jawaban:

20

Bash + coreutils, 13

truncate -s$@

Input dari baris perintah - parameter pertama adalah ukuran file dan yang kedua adalah nama file.

Dari man truncate:

Jika FILE lebih pendek, itu diperpanjang dan bagian yang diperluas (lubang) dibaca sebagai nol byte.

Cobalah online .

Trauma Digital
sumber
1
Bisakah truncate diperpanjang juga?
Adám
11
Seorang pria yang mengenal pria dalam pria jantan memang.
Magic Gurita Guci
Saya ingin tahu apakah ini berfungsi pada partisi FAT, di mana truncatesyscall gagal.
Matteo Italia
1
Implementasi saya dari ide yang sama seharusnya dd bs=1 of=$1 seek=$2<&-(yang mencetak pesan kesalahan yang dapat diabaikan). Milikmu jauh lebih pendek. Bagus.
hvd
@ hvd ya saya pikir dd mungkin bisa melakukan ini
Digital Trauma
4

Groovy, 54 47 43 41 byte

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

-6 Berkat ide manatwork untuk menghapus loop; itu ide asli saya, tidak tahu mengapa saya pikir itu tidak akan berhasil dan memilih untuk loop ... Ini pasti berhasil, baru saja mengujinya.

Tidak Disatukan:

{
    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.
Guci Gurita Ajaib
sumber
1
Bukankah loopless lebih pendek? {a,b->c=new File(a);c<<('\0'*(b-c.size()))}
manatwork
@manatwork ya! Dan itu sebenarnya bisa lebih baik dari itu.
Magic Gurita Guci
@manatwork nevermind, bytecount yang sama (c=new File(a))karena kurung yang diperlukan.
Magic Gurita Guci
1
Tidak tahu mengapa saya menempatkan tanda kurung di seluruh nilai untuk ditambahkan. Tidak dibutuhkan.
manatwork
@manatwork Groovy cukup temperamental tentang tanda kurung, tidak bisa menyalahkan Anda haha.
Magic Gurita Guci
3

Python 2 , 59 57 54 byte

-5 byte terima kasih kepada chepner

def g(n,b):f=open(n,'a');f.write('\0'*b);f.truncate(b)
tongkat
sumber
1
@totallyhuman \x00adalah byte nol.
Pavel
1
@totallyhuman tidak, itu lebih seperti hal bendera (untuk melarang interaksi dengan file tertutup)
Rod
1
@Rod, aku suka berinteraksi! Game interaktif ramah anak terbaik yang pernah ada
caird coinheringaahing
Anda dapat menggunakannya \0sebagai pengganti \x00.
chepner
Anda dapat menyimpan tiga byte dengan melewati batas, maka truncating: def g(n,b):f=open(n,'a');f.write('\0'*b);f.truncate(b).
chepner
3

PHP, 66 byte

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

Mengambil input dari argumen baris perintah; jalankan bersama -nr.


55 byte ini mungkin, tetapi kemungkinan besar tidak akan bekerja:

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

Java (Oracle JRE), 55 byte

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

Spesifikasi setLength(int)mengatakan bahwa byte yang ditambahkan tidak terdefinisi, tetapi secara praktis Oracle JRE hanya menambahkan 0byte (itu sebabnya saya menentukannya).

Sumber daya secara otomatis ditutup oleh JVM sehingga kita tidak perlu melakukannya sendiri.

Uji

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);
  }
}
Olivier Grégoire
sumber
1

AHK, 48 byte

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

1dan 2merupakan dua parameter pertama dalam skrip AHK.
FileGetSizebekerja dalam byte secara default.
Ini tidak mengasyikkan, tetapi sederhana: Dapatkan ukuran, kurangi dari ukuran yang diinginkan, dan tambahkan banyak angka nol.

Toast insinyur
sumber
1

Perl 6 , 40 byte

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

$^adan $^bmerupakan parameter untuk fungsi - nama file dan panjangnya masing-masing.

Sean
sumber
1

Python 2 , 68 byte

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

Cobalah online! (Saat mencetak konten file, kode menggantikan byte nol dengan ASCII 0 untuk visibilitas.)

benar-benar manusiawi
sumber
1
Saya pikir ini menulis nol ASCII dan bukan byte nol
Pavel
Ah ... kata nol itu menyesatkan ...
manusiawi
Ya, memang tertulis dalam huruf besar dalam tantangan itu sendiri.
Pavel
Bisakah Anda menggunakan literal \ x00 dalam string (bukan urutan escape)?
CalculatorFeline
2
Anda tidak dapat menggunakan byte nol literal, tetapi \0lebih pendek.
xnor
1

PowerShell, 69 byte

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 ^

$funtuk file, $suntuk ukuran tujuan, simpan sebagai .ps1 dan jalankan

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

Ini sebuah shell, jadi harus ada loop yang sangat kecil menambahkan 1 byte dengan >>redirection output dan tambahkan, kan? Ya, tidak, karena >>hanya mengeluarkan UCS2-LE multibyte encoding sehingga tidak ada cara untuk menambahkan satu byte ke file dengannya .. kecuali jika Anda menggunakan PSv5.1 dan Anda dapat mengubahnya tetapi itu membuatnya terlalu lama untuk bersaing :

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

Mungkin ada pendekatan .Net Framework? Seharusnya ada, tapi saya tidak bisa membuatnya benar-benar menulis byte, atau kesalahan. Tapi itu lebih lama:

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

Mathematica 50 Bytes

Ekspor Impor

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

Pemakaian

%["test1", 5]
Kelly Lowder
sumber
1

q, 29 byte

Fungsi yang mengambil nama file dalam format :/foo/bar.bazdan panjang sebagai integer.

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

Contoh:

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

C, 56 byte

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

Program menemukan ukuran file, dan berapa byte yang harus ditambahkan. File kemudian menambahkan fs - bbyte tambahan di akhir.

Garhoogin
sumber
1
Selamat datang di PPCG! Ini adalah tantangan kode-golf , jadi tujuan Anda adalah membuat program Anda sekecil mungkin. Anda harus mulai dengan menghapus spasi yang tidak perlu.
Pavel
4
Selain itu, program Anda tampaknya menganggap bahwa input sudah tersimpan dalam nilai fdan b, yang tidak diizinkan. Anda harus memasukkan i / o ke dalam program Anda, yang bisa dari ARGV, input konsol, atau argumen ke suatu fungsi.
Pavel
Terima kasih, saya pikir variabel diasumsikan sudah ditetapkan. Salahku.
Garhoogin
1

C #, 90 byte

using System.IO;s=>n=>File.AppendAllText(s,new string('\0',(int)new FileInfo(s).Length-n))
TheLethalCoder
sumber