编辑:谢谢大家的快速回答。::)
好的,我是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中预先声明缓冲区大小,我可以在read函数本身中指定缓冲区。无论如何,我可以在C中使用缓冲区,而不必像perl那样预先声明它吗?
发布于 2014-05-22 15:38:11
不,在C中,您需要预先提供一个缓冲区大小,并将该缓冲区传递给fread函数。
不过,您不需要指定常量缓冲区大小:在您的情况下,可以在运行时计算0x200的大小,例如,检查正在读取的文件的大小。
但是,请注意,当程序动态地选择缓冲区的大小时,应该将缓冲区放置在动态内存区域,而不是将其留在自动区域(即堆栈上)。这使您可以避免在文件太大时堆栈溢出,因为对自动内存的限制通常比对动态内存的限制严重得多。
您还可以编写渐进式填充缓冲区的代码,并根据需要使用realloc展开缓冲区。有关动态展开读缓冲区的示例,请参阅this answer。
发布于 2014-05-22 15:37:26
无论如何,我是否可以在C中使用缓冲区,而不必像在perl中那样预先声明它?
不是的。
C是一种比Perl低的语言,没有神奇的自调整大小的字符串、缓冲区或数组。您的选项是分配一个比您预期需要的更大的缓冲区,或者将您的文件增量地读取到一个缓冲区中,根据需要调整缓冲区的大小。
发布于 2014-05-22 15:43:11
不,至少不使用标准库。
这是因为在默认情况下C不会自动处理dinamic内存,因为这种控件留给用户。
您可以轻松地到达文件的末尾,读取有多少字节,然后跳转到您的位置,创建一个大小为file_size - file_location的缓冲区并进行文件的剩余读取。
fseek(in, 0L, SEEK_END);
file_size = ftell(fp);https://stackoverflow.com/questions/23811251
复制相似问题