我有以下代码部分:
char*
Sender::PrepareData(char* filename, unsigned long long int bytesToTransfer)
{
int fd, pagesize;
char *data;
ifstream file(filename, ios::binary | ios::ate);
int size = file.tellg();
cout << "File Size: " << size << endl;
if(size < bytesToTransfer)
{cout << "File smaller than specified number of bytes {" << bytesToTransfer << "} to transfer -- Exiting!\n"; exit(1);}
fd = open(filename, O_RDONLY);
if (fd==NULL) {fputs ("File error",stderr); exit (1);}
cout << "File Open: " << filename << endl;
pagesize = getpagesize();
cout << "Pagesize: " << pagesize << endl;
data = static_cast<char*>(mmap((caddr_t)0, bytesToTransfer, PROT_READ, MAP_SHARED, fd, 0));
if (*data == -1) {fputs ("Memory error",stderr); exit (2);}
return data;
}
这似乎适用于文本和.deb文件 - 但是,当尝试使用~3MB图像文件(.jpg)时,我会收到内存错误:
File Size: 3333840
File Open: t1.jpg
Pagesize: 4096
Memory error[Inferior 1 (process 3293) exited with code 02]
我使用mmap()
错了吗?我正在尝试编写一个简单的包装器,它将获取任何类型的文件并返回包含指定字节数的char *。
答案 0 :(得分:6)
您应该只检查data == -1
(或者更好,MAP_FAILED
)和不 *data == -1
(通过*
解除引用是错误的)。
你的代码失败的原因是因为每个JPEG文件的第一个字节是十六进制的FF
或十进制的十进制的-1。
有关JPEG,Google for&#34; JPEG文件格式的详细信息。&#34;例如,搜索&#34; SOI&#34;在this page。