Wypełnij plik zerami

12

Twoim zadaniem dzisiaj będzie pobranie istniejącego pliku i dodanie do niego zer, aż osiągnie określony rozmiar.

Musisz napisać program lub funkcję, która pobierze nazwę pliku w bieżącym katalogu fi liczbę bajtów b. Zachowując oryginalną treść f, musisz napisać na końcu zero (bajty zerowe, a nie ascii 0), aby nowy rozmiar to bbajty.

Możesz założyć, że fw nazwie ma tylko alfanumeryczne ascii, że masz nad nim pełne uprawnienia, że ​​początkowo nie jest większy b, ale może być tak duży b, i że jest nieskończona ilość wolnego miejsca na dysku.

Nie możesz założyć, że fjest niepusty lub że nie zawiera już bajtów o wartości NULL.

Inne istniejące pliki nie powinny być modyfikowane, a nowe pliki nie powinny istnieć po zakończeniu wykonywania.

Przypadki testowe

Zawartość f | b | Wynikowa zawartość f
12345 | 10 | 1234500000
0 | 3 | 000
[pusty] | 2 | 00
[pusty] | 0 | [pusty]
123 | 3 | 123
Pavel
źródło
@totallyhuman początkowo nie jest większy niżb
Adám
Czy możemy pobrać zawartość pliku jako dane wejściowe i wyjściowe zmodyfikowanej zawartości?
Shaggy
Czy możemy korzystać z bibliotek?
Adám
1
@Phoenix Problem polega na tym, że Dennis umieścił bibliotekę w odległym folderze (nie mój wybór). Czy mogę liczyć, jakby był dostępny na ścieżce wyszukiwania?
Adám
Czy możemy założyć, że plik nie będzie już zawierał pustych bajtów?
Dom Hastings,

Odpowiedzi:

20

Bash + coreutils, 13

truncate -s$@

Dane wejściowe z wiersza poleceń - pierwszy parametr to rozmiar pliku, a drugi to nazwa pliku.

Od man truncate:

Jeśli PLIK jest krótszy, jest przedłużany, a rozszerzona część (dziura) jest odczytywana jako zero bajtów.

Wypróbuj online .

Cyfrowa trauma
źródło
1
Czy obcinanie też może się wydłużyć?
Adám
11
Człowiek, który naprawdę zna swoich mężczyzn w męskim mężczyźnie.
Magic Octopus Urn
Zastanawiam się, czy to działa na partycji FAT, gdzie truncatezawodzi syscall.
Matteo Italia
1
Moja implementacja tego samego pomysłu byłaby dd bs=1 of=$1 seek=$2<&-(która wyświetla komunikat o błędzie, który można zignorować). Twoja jest znacznie krótsza. Ładny.
hvd
@hvd tak Pomyślałem, że dd może to zrobić
Digital Trauma
4

Groovy, 54 47 43 41 bajtów

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

-6 dzięki pomysłowi manatwork na usunięcie pętli; to był mój oryginalny pomysł, nie wiem, dlaczego myślałem, że to nie zadziała i wybrałem pętlę ... Zdecydowanie działa, po prostu przetestowałem.

Nie golfowany:

{
    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.
Urna Magicznej Ośmiornicy
źródło
1
Czy nie byłby krótszy bez pętli? {a,b->c=new File(a);c<<('\0'*(b-c.size()))}
manatwork
@manatwork yeah! I może być nawet jeszcze lepszy.
Magic Octopus Urn
@manatwork nevermind, ten sam bytecount z (c=new File(a))powodu wymaganego nawiasu.
Magic Octopus Urn
1
Nie mam pojęcia, dlaczego umieszczam nawiasy wokół całej wartości, aby dołączyć. Nie są potrzebne.
manatwork
@manatwork Groovy jest dość temperamentny w nawiasach, nie mogę cię winić haha.
Magic Octopus Urn
3

Python 2 , 59 57 54 bajtów

-5 bajtów dzięki chepnerowi

def g(n,b):f=open(n,'a');f.write('\0'*b);f.truncate(b)
Pręt
źródło
1
@totallyhuman \x00jest bajtem zerowym.
Pavel
1
@ totalniehuman nie, bardziej przypomina flagę (nie zezwalać na interaktywne pliki z zamkniętymi plikami)
Rod
1
@Rod Uwielbiam interactino! Najlepsza przyjazna dzieciom gra interaktywna
Cairn coinheringaahing
Możesz użyć \0zamiast \x00.
chepner,
Można zapisać kolejne trzy bajty przez overextending, następnie obcinanie: def g(n,b):f=open(n,'a');f.write('\0'*b);f.truncate(b).
chepner,
3

PHP, 66 bajtów

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

Pobiera dane wejściowe z argumentów wiersza poleceń; biegać z -nr.


Te 55 bajtów może, ale najprawdopodobniej nie zadziała:

fseek($p=fopen($argv[1],"w+"),$argv[2]);fputs($p,"\0");
Tytus
źródło
2

Java (Oracle JRE), 55 bajtów

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

Specyfikacja setLength(int)mówi, że dołączone bajty są niezdefiniowane, ale praktycznie środowisko JRE Oracle dołącza tylko 0bajt (dlatego to podałem).

Zasób jest automatycznie zamykany przez JVM, więc nie musimy tego robić sami.

Test

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
źródło
1

AHK, 48 bajtów

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

1i 2są pierwszymi dwoma parametrami w skrypcie AHK.
FileGetSizedomyślnie działa w bajtach.
To nie jest ekscytujące, ale proste: uzyskaj rozmiar, odejmij go od pożądanego rozmiaru i dodaj tyle zer.

Inżynier Toast
źródło
1

Perl 6 , 40 bajtów

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

$^ai $^bsą parametrami funkcji - odpowiednio nazwa pliku i długość.

Sean
źródło
1

Python 2 , 68 bajtów

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

Wypróbuj online! (Podczas drukowania zawartości pliku kod zastępuje puste bajty zerami ASCII 0).

całkowicie ludzki
źródło
1
Myślę, że to zapisuje zera ASCII, a nie bajty zerowe
Pavel
Ach ... słowo zera wprowadzało w błąd ...
całkowicie ludzki,
Cóż, jest napisane dużymi literami w samym wyzwaniu.
Pavel
Czy możesz użyć literału \ x00 w ciągu (nie sekwencję zmiany znaczenia)?
CalculatorFeline
2
Nie można użyć dosłownego bajtu zerowego, ale \0jest on krótszy.
xnor
1

PowerShell, 69 bajtów

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 ^

$fdla pliku, $sdla rozmiaru docelowego, zapisz jako .ps1 i uruchom

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

To powłoka, więc powinna być naprawdę mała pętla dodająca 1 bajt z >>przekierowaniem wyjścia i dołączaniem, prawda? Cóż, nie, ponieważ >>generuje tylko kodowanie wielobajtowe UCS2-LE, więc nie ma sposobu, aby dodać do niego pojedynczy bajt. Chyba że używasz PSv5.1 i możesz to zmienić, ale to sprawia, że ​​jest zbyt długi, aby być konkurencyjnym :

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

Może istnieje podejście .NET Framework? Powinno być, ale nie mogę zmusić go do napisania żadnego bajtu lub błędu. Ale i tak jest już dłuższy:

param($f,$s)[io.file]::WriteAllBytes($f,[byte[]](,0)*($c-(gi $f).length), $True)
TessellatingHeckler
źródło
1

Mathematica 50 bajtów

Import Eksport

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

Stosowanie

%["test1", 5]
Kelly Lowder
źródło
1

q, 29 bajtów

Funkcja, która przyjmuje nazwę pliku w formacie :/foo/bar.bazi długości jako liczbę całkowitą.

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

Przykład:

{hopen[x](0|y-hcount x)#0x00}[`:test.txt;100]
skeevey
źródło
1

C, 56 bajtów

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

Program znajduje rozmiar pliku i liczbę bajtów do dołączenia. Plik następnie dodaje fs - bdodatkowe bajty na końcu.

Garhoogin
źródło
1
Witamy w PPCG! Jest to wyzwanie polegające na grze w golfa , więc Twoim celem jest, aby Twój program był jak najmniejszy. Powinieneś zacząć od usunięcia niepotrzebnych białych znaków.
Pavel
4
Ponadto wydaje się, że twój program zakłada, że ​​dane wejściowe są już zapisane w wartościach fi b, co jest niedozwolone. Państwo musi zawierać I / O do programu, który może być z ARGV, wejście konsoli lub argumentów do funkcji.
Pavel
Dziękuję, myślałem, że zmienne zostały już ustawione. Mój błąd.
Garhoogin,
1

C #, 90 bajtów

using System.IO;s=>n=>File.AppendAllText(s,new string('\0',(int)new FileInfo(s).Length-n))
TheLethalCoder
źródło