fseek和fread C编程

时间:2014-05-22 15:33:23

标签: c fread fseek

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

好的我是 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 ,我可以很容易地找到文件中的任何位置并读取这样的数据:< / p>

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

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

3 个答案:

答案 0 :(得分:1)

  

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

没有

C 是一种比 Perl 更低级的语言,并且没有魔法自调整大小的字符串,缓冲区或数组。您可以选择分配比预期更大的缓冲区,或者将文件逐步读入缓冲区,根据需要调整大小。

答案 1 :(得分:1)

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

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

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

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

答案 2 :(得分:1)

不,至少不使用标准库。

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

你可以轻松地到文件的末尾,读取有多少字节,然后跳转到你的位置,创建一个大小为file_size - file_location的缓冲区并进行你的文件剩余读取

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