[英]fseek and fread C programming
编辑:谢谢大家的快速解答。 :)
好的,我是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中使用buffer而不用像在perl中那样预先声明它吗?
无论如何,我完全可以在C中使用buffer而不用像在perl中那样预先声明它吗?
没有。
C是比Perl低的语言,并且没有魔术般的自动调整大小的字符串,缓冲区或数组。 您的选择是分配一个比预期的要大的巨大缓冲区,或者将文件逐步读取到您需要调整大小的缓冲区中。
不,在C语言中,您需要预先提供缓冲区大小,然后将该缓冲区传递给fread
函数。
但是,您无需指定恒定的缓冲区大小:您情况下的0x200
大小可以在运行时计算出来,例如,通过检查正在读取的文件的大小来计算。
但是请注意,当程序动态选择缓冲区的大小时,应将缓冲区放置在动态内存区域中,而不是将其保留在自动区域中(即,在堆栈上)。 当文件太大时,这可以避免堆栈溢出,因为对自动内存的限制通常比对动态内存的限制要严格得多。
您还可以编写代码来逐步填充缓冲区,并根据需要使用realloc
对其进行扩展。 请参阅此答案以获取动态扩展读取缓冲区的示例。
不,至少不使用标准库。
这是因为默认情况下C不会自动处理动态内存,因为这种控件留给用户使用。
您可以轻松地转到文件的末尾,读取有多少字节,然后跳转到您的位置,创建一个大小为file_size - file_location
的缓冲区,并进行剩余文件读取
fseek(in, 0L, SEEK_END);
file_size = ftell(fp);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.