【问题标题】:How to create file of "x" size?如何创建“x”大小的文件?
【发布时间】:2011-10-15 00:57:26
【问题描述】:

如何在 c 中设置文件的大小?我打开后会这样做吗?

【问题讨论】:

标签: c file-io


【解决方案1】:

是的,你会在 fopen 之后这样做 - 你可以创建所谓的稀疏文件

#include <stdio.h>
int main(void) {
        int X = 1024 * 1024 - 1;
        FILE *fp = fopen("myfile", "w");
        fseek(fp, X , SEEK_SET);
        fputc('\0', fp);
        fclose(fp);
}

这应该为您创建一个 X Byte 文件以满足您的需要,在这种情况下它是 1MiB

【讨论】:

  • 这是 8Mb 的 8 倍。加一个字节。
  • WTF - 从什么时候开始 fseek 以比特为单位工作 - 命名我为 1 个将比特作为参数的 ISO C99 函数
  • 我想不出一个。但是您说文件是 1Mb,而实际上是 1MB。
  • @Ignacio Vazquez-Abrams 实际上,您并没有考虑到“b”和“B”之间的错字比我在 MeagBits 中提供解决方案的情况更有可能。
  • Mb MB 和 MiB 都意味着不同的东西。此示例创建一个大小为 1 MiB 的文件。不是 1MB 或 1Mb。
【解决方案2】:

很惊讶没有人这么说 - 但简单的答案是ftruncate,它可以用来增加文件的长度以及减少它。如果增加额外的文件数据设置为零字节。

FILE *fp=fopen("myfile", "w");
ftruncate(fileno(fp), 1024*1024);
fclose(fp);

请注意,如果您之前写入的数据超出了您要截断的长度,您首先需要 fflush 它(参见此处:ftruncate on file opened with fopen)。

ftruncate 信息:http://linux.die.net/man/2/ftruncate

【讨论】:

  • Somebody did,比你早两年。不过,无论如何都赞成。 :)
【解决方案3】:

普通标准 C 中的唯一方法是在打开文件后将x 字节写入文件以二进制模式,即使这样,标准也允许实现在不告诉你的情况下将任意数量的空字节附加到末尾。

另一方面,使用 POSIX,这很容易。只需拨打ftruncate(fileno(f), x);

【讨论】:

    【解决方案4】:

    你能澄清你的问题吗?您的意思是您正在尝试创建一个具有特定大小的新文件,或者您有一个现有文件并且想要截断它?

    截断现有文件很容易(无论如何,在 Unix 变体中)——使用 truncate() 函数。

    对于创建新文件 - 我不确定您要问什么。您想创建一个空的但具有特定大小的文件吗?为什么你需要这样做?其他人描述的稀疏文件技术(fseek + fputc)创建了一个“稀疏”文件,几乎不占用磁盘空间,但(如果您阅读它)返回全 0。

    【讨论】:

    • 我想设置文件的大小。就像阿德里安建议我“相信”一样。
    • 抱歉,我还是不明白 - 当我要求您澄清“如何设置文件大小”的意思时,您重复了“我想设置大小的文件。”你能澄清你的确切意思,并更详细地描述你在做什么吗?
    • 创建一个空但有特定大小的文件。抱歉回复含糊不清
    • @Questioneer:“空”到底是什么意思?通常,具有非零大小的文件不是空的。文件(在典型系统上)是零个或多个字节的序列,每个字节都有一个值。
    • 我仍然不完全清楚您所说的“空但有特定大小”是什么意思。你的意思是它包含所有的0?你的意思是稀疏文件?您是指已在磁盘上分配空间的文件吗?我们需要更多的上下文来明智地回答这个问题。
    【解决方案5】:

    有很多方法可以做到这一点:

    1 .仅限 C/C++

    您可以将文件指针(使用fseek())移动到您想要的大小,然后写入任何内容。这会将文件的大小设置为文件指针的位置。

    但是,这种方法只能让您增加文件的大小。它不会让你缩小它。

    2 。 (视窗)

    您可以使用CreateFile()制作文件,然后设置文件指针位置并使用SetEndOfFile()设置实际大小。

    此方法在 Windows 中也可用于缩小文件的大小。

    3 . (Linux)

    我不确定这里,但除了 fseek + fwrite 之外,posix 中可能有一些东西可以做到这一点。

    【讨论】:

      猜你喜欢
      • 2015-10-12
      • 2015-12-20
      • 1970-01-01
      • 2012-06-21
      • 1970-01-01
      • 1970-01-01
      • 2010-09-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多