ファイルにゼロを埋め込む


12

今日のタスクは、既存のファイルを取得し、特定のサイズに達するまでゼロを追加することです。

現在のディレクトリ内のファイル名fとバイト数を取得するプログラムまたは関数を作成する必要がありますb。の元のコンテンツを維持しながら、新しいサイズがバイトになるように、末尾にfゼロ(ASCIIバイトではなくヌルバイト)を書き込む必要がありbます。

あなたは、と仮定してよいfことは、当初よりも大きくないと、あなたはそれを完全なアクセス許可を持っていることを、その名前だけでASCII英数字を持っていbますが、同じ大きようなものであってもよいb、と無限の空きディスク容量があること。

f空でないと仮定したり、すでにヌルバイトが含まれていないと仮定したりすることはできません。

実行が終了した後、他の既存のファイルを変更したり、新しいファイルを作成したりしないでください。

テストケース

fの内容| b | fの結果の内容
12345 | 10 | 1234500000
0 | 3 | 000
[空] | 2 | 00
[空] | 0 | [空の]
123 | 3 | 123

@totallyhuman それは最初よりも大きくないb
アダム

ファイルの内容を入力として受け取り、変更された内容を出力できますか?
シャギー

ライブラリを使用できますか?
アダム

1
@Phoenix問題は、デニスがライブラリを遠くのフォルダに置いたことです(私の選択ではありません)。検索パスで利用できるように数えられますか?
アダム

ファイルにすでにヌルバイトが含まれていないと仮定できますか?
ドムヘイスティングス

回答:


20

Bash + coreutils、13

truncate -s$@

コマンドラインからの入力-最初のパラメーターはファイルサイズで、2番目はファイル名です。

からman truncate

FILEが短い場合、それは拡張され、拡張部分(ホール)はゼロバイトとして読み取られます。

オンラインでお試しください


1
切り捨ても拡張できますか?
アダム

11
確かに男らしい男で彼の男を知っている男。
魔法のタコUr

truncatesyscallが失敗するFATパーティションで動作するのだろうか。
マッテオイタリア

1
同じアイデアの私の実装は、dd bs=1 of=$1 seek=$2<&-(無視できるエラーメッセージを出力します)でしょう。あなたのものははるかに短いです。いいね
hvd

@hvdうんddはおそらくこれを行うことができると考えた
デジタル外傷

4

Groovy、54 47 43 41バイト

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

-6ループを削除するというmanatworkのアイデアに感謝します。それは私の最初のアイデアでしたが、なぜそれがうまくいかないと思ったのかわからず、ループを選択しました...

ゴルフをしていない:

{
    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
ループレスで短くなりませんか?{a,b->c=new File(a);c<<('\0'*(b-c.size()))}
マナトワーク

@manatworkええ!そして、実際にはそれよりもさらに優れている可能性があります。
魔法のタコUr

@manatwork nevermind、(c=new File(a))必要な括弧による同じバイト数。
魔法のタコUr

1
追加する値全体を括弧で囲んだ理由がわかりません。必要ありません。
マナトワーク

@manatwork Groovyは、括弧についてはかなり気まぐれです。
魔法のタコUr


3

パイソン259の 57 54バイト

chepnerのおかげで-5バイト

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

1
@totallyhuman \x00はヌルバイトです。
パベル

1
@totallyhumanいいえ、それはフラグのようなものです(閉じたファイルとの相互作用を禁止するため)
ロッド

1
@Rod私はinteractinoが大好きです!これまでで最高の子供向けのインタラクティブなゲーム
ケアニアン共演

\0代わりに使用できます\x00
-chepner

次のように拡張してから切り捨てることで、さらに3バイト節約できますdef g(n,b):f=open(n,'a');f.write('\0'*b);f.truncate(b)
-chepner

3

PHP、66バイト

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

コマンドライン引数から入力を受け取ります。で実行し-nrます。


これらの55バイトは機能する可能性がありますが、ほとんどの場合機能しません。

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

2

Java(Oracle JRE)、55バイト

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

の仕様でsetLength(int)は、追加されたバイトは未定義ですが、実際にはOracle JREは0バイトのみを追加します(そのため、指定しました)。

リソースはJVMによって自動的に閉じられるため、自分で行う必要はありません。

テスト

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バイト

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

1および2は、AHKスクリプトの最初の2つのパラメーターです。
FileGetSizeデフォルトではバイト単位で機能します。
エキサイティングではありませんが、簡単です:サイズを取得し、目的のサイズからそれを減算し、その数のゼロを追加します。


1

Perl 6、40バイト

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

$^aおよび$^bは、関数のパラメーター(ファイル名と長さ)です。


1

Python 2、68バイト

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

オンラインでお試しください!(ファイルのコンテンツを印刷するとき、コードは可視性のためにヌルバイトをASCII 0に置き換えます。)


1
私は、これはNULLバイトのASCIIゼロを書き込み、いないと思う
パベル

ああ...ゼロという言葉は誤解を招く
...-完全に人間

まあ、それは挑戦自体に大きな文字で言っています。
パベル

文字列でリテラルの\ x00を使用できますか(エスケープシーケンスではありません)?
CalculatorFeline

2
リテラルのヌルバイトを使用することはできませんが、\0より短いです。
xnor

1

PowerShell、69バイト

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ファイルの場合$s、宛先サイズの場合、.ps1として保存して実行します

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

それはシェルなので、>>出力リダイレクトと追加で1バイトを追加する本当に小さなループがあるはずですよね?それは、>>UCS2-LEマルチバイトエンコーディングのみを出力するため、PSv5.1を使用していて変更できない限り、1バイトをファイルに追加する方法がないからです。 :

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

.Net Frameworkのアプローチがあるかもしれません。あるはずですが、実際にバイトやエラーを書き込むことはできません。とにかく長いです:

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

1

Mathematica 50バイト

インポート・エクスポート

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

使用法

%["test1", 5]

1

q、29バイト

形式のファイル名:/foo/bar.bazと長さを整数としてとる関数。

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

例:

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

1

C、56バイト

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

プログラムはファイルのサイズと追加するバイト数を見つけます。その後、ファイルfs - bは最後に余分なバイトを追加します。


1
PPCGへようこそ!これはコードゴルフの課題なので、目的はプログラムをできるだけ小さくすることです。不要な空白を削除することから始めてください。
パベル

4
さらに、プログラムは、入力が既に値fandに保存されていると想定しているようですがb、これは許可されていません。i / oをプログラムに含める必要あります。これはfrom ARGV、コンソール入力、または関数の引数です。
パベル

ありがとう、私は変数がすでに設定されていると仮定したと思った。私の悪い。
ガルフギン

1

C#、90バイト

using System.IO;s=>n=>File.AppendAllText(s,new string('\0',(int)new FileInfo(s).Length-n))
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.