以下是代码:
#include <stdio.h>
#include <sys/stat.h>
void dump_buffer(void *buffer, off64_t buffer_size)
{
off64_t i;
for(i = 0;i < buffer_size; ++i)
{
printf("%02x \n", ((unsigned char *)buffer)[i]);
}
printf("\n");
}
void ReadFile(std::string fn)
{
FILE *file;
file = fopen(fn.c_str(), "rb");
if (!file)
{
fprintf(stderr, "Unable to open file %s", fn.c_str());
return;
}
struct stat64 fsStatBuf;
stat64(fn.c_str(), &fsStatBuf);
off64_t fileLen = fsStatBuf.st_size;
// fseek(file, 0, SEEK_END);
// fileLen=ftell(file);
// fseek(file, 0, SEEK_SET);
unsigned char *buffer;
buffer=(unsigned char *)malloc(fileLen+1);
if (!buffer)
{
fprintf(stderr, "Memory error!");
fclose(file);
return;
}
fread(buffer, 1, fileLen, file);
fclose(file);
dump_buffer(buffer, fileLen);
free(buffer);
}
fread
将文件读入内存块,即堆。
有没有办法将文件读入堆栈?
答案 0 :(得分:2)
当然 - 假设您的筹码足够大以容纳fileLen+1
项,您可以这样做:
unsigned char buffer[fileLen+1];
并在结尾处跳过对free()
的呼叫。这是有效的,因为C99允许您创建可变大小的数组。但是,在C ++中,这不起作用 * 。但是,由于大多数程序都在C语言中,因此您应该能够使用符合C99标准的编译器来使用标准C构造。
但请注意,与malloc
不同的是,如果失败会返回NULL
,让您在文件过大时处理内存不足的情况,这种方式在自动区域中分配内存(即在堆栈上)会立即崩溃你的程序。
另请注意,由于该文件不是C字符串,因此您不需要fileLen+1
; fileLen
足以适合整个文件。
* 有些编译器提供C ++语言扩展来支持可变长度数组,但结果代码不是标准代码。
答案 1 :(得分:2)
我认为拥有以下内容会更加轻松:
unsigned char buffer[MAXFILESIZE];
然后在写入之前检查文件大小,如果文件太大则检查失败。