首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >fread和fread C程序设计

fread和fread C程序设计
EN

Stack Overflow用户
提问于 2014-05-22 15:33:23
回答 3查看 6.5K关注 0票数 2

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

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

代码语言:javascript
复制
#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,我可以轻松地查找文件中的任何位置,并读取如下所示的数据块:

代码语言:javascript
复制
seek ( $file, 0x8F00, 0);
read ( $file, $buffer, 0x200);

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-05-22 15:38:11

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

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

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

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

票数 2
EN

Stack Overflow用户

发布于 2014-05-22 15:37:26

无论如何,我是否可以在C中使用缓冲区,而不必像在perl中那样预先声明它?

不是的。

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

票数 1
EN

Stack Overflow用户

发布于 2014-05-22 15:43:11

不,至少不使用标准库。

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

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

代码语言:javascript
复制
fseek(in, 0L, SEEK_END);
file_size = ftell(fp);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23811251

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档