Fülle eine Datei mit Nullen auf

12

Ihre Aufgabe heute wird es sein, eine vorhandene Datei zu nehmen und Nullen an sie anzuhängen, bis sie eine bestimmte Größe erreicht.

Sie müssen ein Programm oder eine Funktion schreiben, die den Namen einer Datei im aktuellen Verzeichnis fund eine Anzahl von Bytes enthält b. Während Sie den ursprünglichen Inhalt von beibehalten f, müssen Sie Nullen (Nullbytes, keine ASCII- Nullen ) an das Ende schreiben , damit die neue Größe bByte ist.

Sie können davon ausgehen, dass fnur alphanumerische ASCII-Zeichen im Namen vorhanden sind, dass Sie über die vollständigen Berechtigungen verfügen, dass sie anfangs nicht größer als b, aber möglicherweise so groß bsind und dass unendlich viel freier Speicherplatz vorhanden ist.

Sie dürfen nicht davon ausgehen f, dass es nicht leer ist oder dass es noch keine Null-Bytes enthält.

Andere vorhandene Dateien sollten nicht geändert werden, und neue Dateien sollten nach Beendigung der Ausführung nicht mehr vorhanden sein.

Testfälle

Inhalt von f | b | Resultierender Inhalt von f
12345 | 10 | 1234500000
0 | 3 | 000
[leer] | 2 | 00
[leer] | 0 | [leeren]
123 | 3 | 123
Pavel
quelle
@totallyhuman es ist anfangs nicht größer alsb
Adám
Können wir den Inhalt der Datei als Eingabe nehmen und den geänderten Inhalt ausgeben?
Shaggy
Dürfen wir Bibliotheken benutzen?
Adám
1
@Phoenix Das Problem ist, dass Dennis die Bibliothek in einem weit entfernten Ordner abgelegt hat (nicht meine Wahl). Kann ich zählen, als ob es im Suchpfad vorhanden wäre?
Adám
Können wir davon ausgehen, dass die Datei nicht bereits null Bytes enthält?
Dom Hastings

Antworten:

20

Bash + Coreutils, 13

truncate -s$@

Eingabe über die Befehlszeile - der erste Parameter ist die Dateigröße und der zweite der Dateiname.

Von man truncate:

Wenn eine DATEI kürzer ist, wird sie erweitert und der erweiterte Teil (Loch) wird als Null-Byte gelesen.

Probieren Sie es online aus .

Digitales Trauma
quelle
1
Kann auch abgeschnitten werden?
Adám
11
Ein Mann, der seinen Mann in der Tat in einem männlichen Mann kennt.
Magic Octopus Urn
Ich frage mich, ob es auf einer FAT-Partition funktioniert, wo der truncateSyscall fehlschlägt.
Matteo Italia
1
Meine Implementierung der gleichen Idee wäre gewesen dd bs=1 of=$1 seek=$2<&-(die eine Fehlermeldung ausgibt, die ignoriert werden kann). Ihre ist viel kürzer. Nett.
HDV
@hvd yep Ich dachte, dd könnte dies wahrscheinlich tun
Digital Trauma
4

Groovy, 54 47 43 41 Bytes

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

-6 dank der Idee von manatwork, die Schleife zu entfernen; Das war meine ursprüngliche Idee, ich weiß nicht, warum ich dachte, es würde nicht funktionieren und entschied mich für eine Schleife ... Es funktioniert definitiv, habe es nur getestet.

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.
Magic Octopus Urn
quelle
1
Wäre es nicht kürzer ohne Schleife? {a,b->c=new File(a);c<<('\0'*(b-c.size()))}
Manatwork
@manatwork ja! Und es kann sogar noch besser sein.
Magic Octopus Urn
@manatwork nevermind, gleiches bytecount für (c=new File(a))wegen erforderlicher Klammern.
Magic Octopus Urn
1
Keine Ahnung, warum ich den gesamten Wert in Klammern setze, um ihn anzufügen. Nicht benötigt.
Manatwork
@manatwork Groovy ist ziemlich temperamentvoll in Bezug auf die Klammer, kann dir nicht die Schuld geben, haha.
Magic Octopus Urn
3

Python 2 , 59 57 54 Bytes

-5 bytes dank chepner

def g(n,b):f=open(n,'a');f.write('\0'*b);f.truncate(b)
Stange
quelle
1
@totallyhuman \x00ist ein Null-Byte.
Pavel
1
@totallyhuman Nein, es ist eher wie eine Flaggensache (Interaktion mit geschlossenen Dateien zu verbieten)
Rod
1
@ Rod Ich liebe interactino! Bestes kinderfreundliches interaktives Spiel aller Zeiten
Caird Coinheringaahing
Sie können \0anstelle von verwenden \x00.
Chepner
Sie können durch Überdehnung noch drei Bytes speichern, dann Kürzen: def g(n,b):f=open(n,'a');f.write('\0'*b);f.truncate(b).
Chepner
3

PHP, 66 Bytes

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

Übernimmt Eingaben von Befehlszeilenargumenten; renn mit -nr.


Diese 55 Bytes könnten, werden aber höchstwahrscheinlich nicht funktionieren:

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

Java (Oracle JRE), 55 Byte

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

Die Spezifikation von setLength(int)besagt, dass die angehängten Bytes undefiniert sind, aber praktisch hängt die Oracle-JRE nur das 0Byte an (deshalb habe ich es angegeben).

Die Ressource wird von der JVM automatisch geschlossen, sodass wir dies nicht selbst tun müssen.

Prüfung

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
quelle
1

AHK, 48 Bytes

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

1und 2sind die ersten beiden Parameter in einem AHK-Skript.
FileGetSizeArbeitet standardmäßig in Bytes.
Es ist nicht aufregend, aber einfach: Ermitteln Sie die Größe, subtrahieren Sie sie von der gewünschten Größe und fügen Sie so viele Nullen hinzu.

Ingenieur Toast
quelle
1

Perl 6 , 40 Bytes

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

$^aund $^bsind die Parameter der Funktion - der Dateiname bzw. die Länge.

Sean
quelle
1

Python 2 , 68 Bytes

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

Probieren Sie es online! (Beim Drucken des Dateiinhalts ersetzt der Code Nullbytes durch ASCII-Nullen, um die Sichtbarkeit zu gewährleisten.)

total menschlich
quelle
1
Ich denke, dies schreibt ASCII-Nullen und nicht null Bytes
Pavel
Ah ... das Wort Nullen war irreführend ...
totalhuman
Nun, es steht in großen Buchstaben in der Herausforderung.
Pavel
Können Sie ein Literal \ x00 in der Zeichenfolge verwenden (keine Escape-Sequenz)?
CalculatorFeline
2
Sie können kein Null-Byte-Literal verwenden, es \0ist jedoch kürzer.
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 ^

$f$sSpeichern Sie für die Datei die Zielgröße als .ps1 und führen Sie sie aus

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

Es ist eine Shell, also sollte es eine wirklich kleine Schleife geben, die 1 Byte mit >>Ausgabeumleitung und Anhängen hinzufügt , oder? Nein, denn es wird >>nur UCS2-LE-Multibyte-Codierung ausgegeben, sodass es keine Möglichkeit gibt, einer Datei ein einzelnes Byte hinzuzufügen. Es sei denn, Sie verwenden PSv5.1 und können dies ändern, aber das macht es zu lang, um wettbewerbsfähig zu sein :

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

Vielleicht gibt es einen .Net Framework-Ansatz? Es sollte geben, aber ich kann es nicht dazu bringen, tatsächlich Bytes oder Fehler zu schreiben. Aber es ist trotzdem länger:

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

Mathematica 50 Bytes

Import Export

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

Verwendung

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

q, 29 Bytes

Funktion, die Dateinamen in Format :/foo/bar.bazund Länge als Ganzzahl verwendet.

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

Beispiel:

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

C 56 Bytes

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

Das Programm ermittelt die Dateigröße und die Anzahl der anzuhängenden Bytes. Die Datei fügt dann fs - bzusätzliche Bytes am Ende hinzu.

Garhoogin
quelle
1
Willkommen bei PPCG! Dies ist eine Code-Golf- Herausforderung. Ihr Ziel ist es, Ihr Programm so klein wie möglich zu halten. Sie sollten zunächst unnötige Leerzeichen entfernen.
Pavel
4
Außerdem scheint Ihr Programm davon auszugehen, dass die Eingaben bereits in den Werten fund gespeichert sind b, was nicht erlaubt ist. Du musst I / O in Ihr Programm ARGVeinbinden. Dies können From- , Console-Input- oder Argumente für eine Funktion sein.
Pavel
Vielen Dank, ich dachte, dass die Variablen bereits als gesetzt angenommen wurden. Mein Fehler.
Garhoogin
1

C #, 90 Bytes

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