C++ 将二进制文件读入堆栈而不是堆
代码如下:C++ 将二进制文件读入堆栈而不是堆,c++,memory-management,C++,Memory Management,代码如下: #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 R
#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);
}
#包括
#包括
无效转储缓冲区(无效*缓冲区,off64缓冲区大小)
{
主任64(一);
对于(i=0;i
fread
将文件读入内存块,即堆。
是否有办法将文件读入堆栈?当然-假设堆栈足够大,可以容纳
fileLen+1
项,则可以执行以下操作:
unsigned char buffer[fileLen+1];
并跳过最后对free()
的调用。这是可行的,因为C99允许您创建大小可变的数组。然而,C++中,这将无法工作。但是,由于您的大多数程序都是C语言的,您应该能够通过使用符合C99标准的编译器来使用标准C结构
但是,请注意,与故障时返回NULL
的malloc
不同,它允许您在文件太大时处理内存不足的情况,这种在自动区域(即堆栈上)分配内存的方法将立即使您的程序崩溃
还要注意,由于文件不是C字符串,因此不需要fileLen+1
<代码>文件长度足以容纳整个文件
<> P>有编译器提供了C++语言扩展来支持可变长度数组,但是结果代码不是标准的。 < P>当然-假设你的堆栈足够大,可以容纳<代码> FielEn+1 项目,你可以这样做:
unsigned char buffer[fileLen+1];
并跳过最后对free()
的调用。这是可行的,因为C99允许您创建大小可变的数组。然而,C++中,这将无法工作。但是,由于您的大多数程序都是C语言的,您应该能够通过使用符合C99标准的编译器来使用标准C结构
但是,请注意,与故障时返回NULL
的malloc
不同,它允许您在文件太大时处理内存不足的情况,这种在自动区域(即堆栈上)分配内存的方法将立即使您的程序崩溃
还要注意,由于文件不是C字符串,因此不需要fileLen+1
<代码>文件长度足以容纳整个文件
<> P>有编译器提供了一个C++语言扩展来支持可变长度数组,但是结果代码不是标准的。 < P>我认为它具有更便携性:
unsigned char buffer[MAXFILESIZE];
然后在写入之前检查文件大小,如果文件太大,则会失败。我认为如果有:
unsigned char buffer[MAXFILESIZE];
然后在写入之前检查文件大小,如果文件太大则会失败。为什么要将其放在堆栈上?您正在读取的文件有多大?没有具体原因,只是想知道是否可以这样做,以及为什么人们通常使用堆来处理这类内容。:)堆栈可以处理多大的文件?这取决于编译器设置(至少在基于windows的系统上)。我不会尝试在堆栈上存储大小未知的对象。为什么要在堆栈上存储它?您正在读取的文件有多大?没有具体原因,只是想知道是否可以这样做,以及为什么人们通常使用堆来处理这类内容。:)堆栈可以处理多大的文件?这取决于编译器设置(至少在基于windows的系统上)。我不会尝试在堆栈上存储大小未知的对象。请注意,这需要编译器的c99支持。@vlad_tepesch“请注意,这需要编译器的c99支持”我这样做了。大多数C编译器,除了2012年以前的VS,现在都是这样。我怀疑大多数编译器是否兼容c99。这可能适用于一些最流行的PC编译器。但不是所有定制的制造商提供的嵌入式编译器。@ ununvt?“OP有一个C标记,除了C++错误的用法:STE::String ,这里没有任何C++ + SISH。但是,C++就是这样结束的。代码的其余部分是常规C:它使用
malloc
而不是new[]
,在整个过程中使用C格式、C I/O库等等。请注意,这需要编译器的c99支持。@vlad_tepesch“请注意,这需要编译器的c99支持”我做到了。大多数C编译器,除了2012年以前的VS,现在都是这样。我怀疑大多数编译器是否兼容c99。这可能适用于一些最流行的PC编译器。但不是所有定制的制造商提供的嵌入式编译器。@ ununvt?“OP有一个C标记,除了C++错误的用法:STE::String ,这里没有任何C++ + SISH。但是,C++就是这样结束的。代码的其余部分是常规的C:它使用malloc
而不是new[]
,使用C格式、C I/O库等等。