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

@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 .


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.

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)

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

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

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.


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.


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.)


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)

1

Mathematica 50 Bytes

Ekspor Impor

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

Pemakaian

%["test1", 5]

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]

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.


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))
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.