【问题标题】:fseek and fread C programmingfseek 和 fread C 编程
【发布时间】:2014-05-22 15:33:23
【问题描述】:

编辑:感谢大家的快速回答。 :)

好的,我是 C 的新手,我可以打开一个文件并将其设置到文件中的某个位置,并使用以下代码读取一大块数据并将其写入另一个文件:

#include <stdio.h>

int main (int argc, unsigned char *argv[])

  {

      FILE* in = fopen(argv[1], "rb");
      FILE* out = fopen("test.bin", "wb");

      unsigned char buffer[0x200];

      fseek(in, 0x8F00, SEEK_SET);
      fread(buffer, sizeof(buffer), 1, in);   
      fwrite(buffer, sizeof(buffer), 1, out);
  };


但是我有点精通 perl,我可以轻松地查找文件中的任何位置并读取如下数据块:

seek ( $file, 0x8F00, 0);
read ( $file, $buffer, 0x200);

如您所见,我不必在 perl 中预先声明我的缓冲区大小,我可以在读取函数本身中指定缓冲区。有没有我可以在 C 中使用缓冲区而不必像在 perl 中那样预先声明它?

【问题讨论】:

  • C 中所有使用的变量都必须声明和定义。
  • 想一想——perl 是用 C 编写的
  • 我知道并且我经常使用 perl,我选择迁移到 C 是因为我想做的 /now/ 需要 C 编程,但是是的,perl 非常快,而且编程也很快:)

标签: c fread fseek


【解决方案1】:

不,在 C 中,您需要预先提供缓冲区大小,然后将该缓冲区传递给 fread 函数。

不过,您不需要指定恒定的缓冲区大小:在您的情况下,0x200 的大小可以在运行时计算,例如,通过检查您正在读取的文件的大小。

但是请注意,当您的程序动态选择缓冲区的大小时,您应该将缓冲区放在动态内存区域中,而不是将其留在自动区域中(即在堆栈上)。当文件太大时,这可以避免堆栈溢出,因为对自动内存的限制通常比对动态内存的限制严格得多。

您还可以编写增量填充缓冲区的代码,并根据需要使用realloc 扩展它。有关动态扩展读取缓冲区的示例,请参阅this answer

【讨论】:

  • 我正在读取一个文件,在这个文件中我知道块的大小等,我只是想知道是否有办法像 fread(buffer, 0x200, 1, out);
    但看起来不可能 ;(
  • @james28909 标准 C 库没有您正在寻找的函数这一事实不应该阻止您自己编写这样的函数。唯一需要记住的是,如果你走这条路,你必须用malloc动态分配缓冲区,因为函数不能返回本地数组。
  • 好吧,我有这个文件,里面有很多我需要提取的数据,我想我要做的就是先在我的操作中对其进行编码,然后习惯一切,这样会更有意义从长远来看,我会回去开始重写并尝试新的东西:P感谢链接和明确的答案
  • 仅供参考,我今天能够坐下来,终于回到了这个话题。我能够做到,但不是我采用的方法。我不得不稍微改变它,但我现在让它完美无缺。谢谢!
【解决方案2】:

反正我可以在 C 中使用缓冲区,而不必像在 perl 中那样预先声明它吗?

没有。

C 是一种比 Perl 低级的语言,并且没有神奇的自调整大小的字符串、缓冲区或数组。您的选择是分配一个比您预期需要的更大的缓冲区,或者将文件增量读取到您根据需要调整大小的缓冲区中。

【讨论】:

    【解决方案3】:

    不,至少不使用标准库。

    这是因为默认情况下 C 不会自动处理动态内存,因为这种控制权留给了用户。

    您可以轻松转到文件末尾,读取有多少字节,然后跳转到您的位置,创建大小为 file_size - file_location 的缓冲区并读取文件的其余部分

    fseek(in, 0L, SEEK_END);
    file_size = ftell(fp);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-21
      • 2021-02-19
      • 1970-01-01
      • 2015-08-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多