用零填充文件


12

今天的任务是获取一个现有文件,并将零添加到该文件,直到达到一定大小为止。

您必须编写一个程序或函数,该程序或函数采用当前目录中文件的名称f和字节数b。在保留的原始内容的同时f,您必须在末尾写入零(空字节,而不是ascii 0),以便其新大小为b字节。

您可以假设名称中f仅包含字母数字的ascii,您对此具有完全权限,其初始大小不大于b,但可能与一样大b,并且有无限的可用磁盘空间。

您可能不会假设f它是非空的,或者它不已经包含空字节。

执行结束后,不应修改其他现有文件,也不应该存在新文件。

测试用例

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

@totallyhuman 它最初是不是比largetb
亚当

我们可以将文件的内容作为输入并输出修改后的内容吗?
毛茸茸的

我们可以使用图书馆吗?
亚当

1
@Phoenix问题是Dennis将库放在一个很远的文件夹中(不是我的选择)。我可以算作它在搜索路径中可用吗?
亚当

我们可以假设文件中将不再包含空字节吗?
Dom Hastings

Answers:


20

Bash + coreutils,13

truncate -s$@

从命令行输入-第一个参数是文件大小,第二个参数是文件名。

来自man truncate

如果FILE较短,则将其扩展,并且扩展的部分(孔)读取为零字节。

在线尝试


1
截断也可以延伸吗?
亚当

11
一个认识自己男人的男人的确是男人。
Magic Octopus Urn

我想知道它是否可以在FAT分区上运行,而truncatesyscall失败。
Matteo Italia

1
我将实现相同的想法dd bs=1 of=$1 seek=$2<&-(它会显示一条错误消息,可以忽略)。你的要短得多。真好
hvd

@hvd是的,我认为dd可能可以做到这一点
Digital Trauma

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

@manatwork是的!实际上,它甚至可以比这更好。
Magic Octopus Urn

@manatwork没关系,(c=new File(a))由于需要括号,所以字节数相同。
Magic Octopus Urn

1
不知道为什么我在整个值后面加上括号。并不需要。
manatwork

@manatwork Groovy对括号很有气质,不能怪你哈哈。
Magic Octopus Urn


3

Python 2中59个 57 54字节

-5字节归功于chepner

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

1
@totallyhuman \x00是一个空字节。
帕维尔

1
@totallyhuman不,这更像是一个标志性的事情(禁止使用已关闭的文件进行交互)
Rod

1
@Rod我爱interactino!有史以来最适合儿童的互动游戏
Caird coinheringaahing

您可以\0代替使用\x00
chepner '17

您可以通过过度扩展然后截断以下内容来节省另外三个字节: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%

12是AHK脚本中的前两个参数。
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
我认为这写的是ASCII零而不是空字节
Pavel

啊...“零”这个词是令人误解的……
完全

好吧,它确实在挑战本身中用大写字母表示。
帕维尔

您可以在字符串中使用文字\ 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,并且可以更改它,但是这样太长了,不具有竞争力:

$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

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
另外,您的程序似乎假设输入已经存储在value f和中b,这是不允许的。您必须在程序中包含I / O,它可以来自ARGV,控制台输入或函数的参数。
Pavel

谢谢,我认为已假定已设置变量。我的错。
Garhoogin

1

C#,90个字节

using System.IO;s=>n=>File.AppendAllText(s,new string('\0',(int)new FileInfo(s).Length-n))
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.