C++ 为什么此代码不将图像复制到char数组?
我正在尝试将图像复制到字符数组。它与文档示例中的类似,但不能正常工作。下面的代码有什么问题C++ 为什么此代码不将图像复制到char数组?,c++,ubuntu-16.04,C++,Ubuntu 16.04,我正在尝试将图像复制到字符数组。它与文档示例中的类似,但不能正常工作。下面的代码有什么问题 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* 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;
}
你的测试有问题
strlen
要求参数为以null结尾的字符串,并在遇到第一个null之前返回非null字符数。我知道没有以null结尾的图像格式,因此您的字符数组可能不保证包含任何以null结尾的字符
将res
插入到输出流(例如cout
)中同样是错误的,因为同样需要空终止
看起来图像文件的第五个字节恰好与空终止字符具有相同的表示形式,但这并不意味着图像没有被复制
ifstream::gcount
可用于查询读取字节数,ostream::write
可用于输出可能包含或不包含空终止字符的字符数组的全部内容
虽然技术上是正确的,但是创建动态对象并从函数返回一个空指针是一个非常糟糕的主意。很可能是内存泄漏或其他错误。我建议改用
std::vector
。您的图像很可能不是以nul结尾的字符串std::strlen
只会阻塞第一个零字节,std::cout
也无法显示任何有意义的内容。您指定了程序的输出。看起来不错。您希望它输出其他内容吗?图像的长度是n
,而不是strlen(res)
。这就是你的错误所在。
n = 6942
all characters read successfully.
length = 4