bool CLI_GetPicInfo(IN char *pcPath, INOUT unsigned int *pulBuflen, INOUT char **ppcBuffer)
struct stat statbuf;
unsigned int ulBuflen = 0;
char *pcBuffer = NULL;
int lReadlen = 0;
int fd = 0;
if (stat(pcPath, &statbuf) < 0)
return false;
ulBuflen = statbuf.
st_size;
if (0 == ulBuflen)
return false;
pcBuffer = (char *)malloc(ulBuflen);
if (NULL == pcBuffer)
return false;
memset(pcBuffer, 0, ulBuflen);
fd = open(pcPath, O_RDONLY);
if (fd < 0)
return false;
lReadlen = read(fd, pcBuffer, ulBuflen);
if ((lReadlen < 0) || ((unsigned int) lReadlen != ulBuflen))
free(pcBuffer);
pcBuffer = NULL;
close(fd);
return false;
close(fd);
*pulBuflen = ulBuflen;
*ppcBuffer = pcBuffer;
return true;
int main(){
unsigned int ulBuflen = 0;
char *pcImgBuf = NULL;
if (!CLI_GetPicInfo("/home/a.jpg", &ulBuflen, &pcImgBuf))
printf("Failed to get pic info %s.\n", stRtDirInfo.szName);
return -1;
free(pcImgBuf);
pcImgBuf = NULL;
#include <fstream>
#include <iostream>
#define MAX 1024*1024
using namespace std;
bool write_image(const string& filename, char *pBuffer, int length){
ofstream fout(filename, ios::binary);
if(!fout){
printf("can't open = %s\n", filename.c_str());
return false;
fout.write(pBuffer,length);
fout.close();
return true;
bool write_image2(const string& filename, char *image_buf, int image_len){
int fd = open(filename.c_str(), O_CREAT | O_WRONLY | O_TRUNC);
if (fd > 0) {
int n = 0, m = 0;
do {
m = write(fd, image_buf + n, image_len - n);
n += m;
} while (n < image_len);
close(fd);
bool read_image(const string& filename, char * pBuffer, int *out_length){
ifstream fin(filename, ifstream::in | ios::binary);
if(!fin){
printf("can't open = %s\n", filename.c_str());
return false;
fin.seekg(0, std::ifstream::end);
int length = fin.tellg();
fin.seekg(0, std::ifstream::beg);
if(length <= 0 || length > MAX){
printf("length = %d\n", length);
return false;
*out_length = length;
fin.read(pBuffer, length);
fin.close();
return true;
int main(){
char * pBuffer = new char[MAX];
int length = 0;
bool succ = read_image( R"(D:\workspace\binarytree\test.jpg)", pBuffer, &length);
if(succ){
write_image(R"(D:\workspace\binarytree\save.jpg)", pBuffer, length);
write_image(R"(D:\workspace\binarytree\save.png)", pBuffer, length);
write_image(R"(D:\workspace\binarytree\save.txt)", pBuffer, length);
write_image(R"(D:\workspace\binarytree\save.bmp)", pBuffer, length);
write_image(R"(D:\workspace\binarytree\save.raw)", pBuffer, length);
delete [] pBuffer;
return 0;
int main11(){
char pBuffer[MAX] = {0};
int length = 0;
bool succ = read_image( R"(D:\workspace\binarytree\test.jpg)", pBuffer, &length);
if(succ){
write_image(R"(D:\workspace\binarytree\save.jpg)", pBuffer, length);
write_image(R"(D:\workspace\binarytree\save.png)", pBuffer, length);
write_image(R"(D:\workspace\binarytree\save.txt)", pBuffer, length);
write_image(R"(D:\workspace\binarytree\save.bmp)", pBuffer, length);
write_image(R"(D:\workspace\binarytree\save.raw)", pBuffer, length);
return 0;
在创建文件流时,可以显示指定它的打开方式为ios::binary,也就是以二进制方式打开。但是,无论是否指定二进制方式打开文件,读写的最小单位都是字节。那么,它到底起到什么作用呢?
首先,介绍一下二进制方式打开与普通打开方式的区别,两者大的区别在于对换行符的处理方式不同。由于历史原因,Windows操作系统是用两个字符(\r\n)来表示换行符的;而Unix操作系统却是用单个字符(\n)来表示换行符的。因此,在创建文件流时,如果指定了以ios::binary方式打开,那么换行符就是单字符的;否则,就采用Windows操作系统的双字符。
总结来说,以ios::binary方式打开,换行符被解释成\n;反之,换行符被解释成\r\n。
所以为了兼容性,通常在Windous系统中通常使用ios::binary方式打开图像文件;在Unix(或类Unix)操作系统中,指定和不指定ios::binary方式没有区别。