我正在尝试将图像复制到char数组。它就像在文档示例中,但无法正常工作。下面的代码出了什么问题?
char* getImage(char* path){
ifstream image;
image.open(path, ifstream::binary);
image.seekg (0, ios::end);
int n = image.tellg();
printf("n = %d\n", n);
image.seekg (0, ios::beg);
char* res = new char[n];
image.read(res, n);
if (image)
std::cout << "all characters read successfully." << endl;
printf("length = %d", strlen(res));
cout<<res<<"\n\n";
image.close();
return res;
}
我的程序输出;
n = 6942
all characters read successfully.
length = 4
答案 0 :(得分:1)
您的测试有问题。 strlen
要求参数为空终止字符串,并在遇到第一个空值之前返回非空字符数。我知道没有以null结尾的图像格式,所以你的char数组可能不保证包含任何空终止字符。
将res
插入输出流(例如cout
)同样有问题,因为空终止的要求相同。
图像文件的第五个字节似乎与空终止字符具有相同的表示,但这并不意味着图像未被复制。
ifstream::gcount
可用于查询读取字节数,ostream::write
可用于输出可能包含或不包含空终止字符的字符数组的整个内容。
PS。虽然技术上是正确的,但创建动态对象并从函数返回裸指针是一个非常糟糕的主意。内存泄漏或其他错误很可能发生。我建议改用std::vector
。