为什么这段代码不会将图像复制到char数组?

时间:2017-02-08 11:13:45

标签: c++ ubuntu-16.04

我正在尝试将图像复制到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

1 个答案:

答案 0 :(得分:1)

您的测试有问题。 strlen要求参数为空终止字符串,并在遇到第一个空值之前返回非空字符数。我知道没有以null结尾的图像格式,所以你的char数组可能不保证包含任何空终止字符。

res插入输出流(例如cout)同样有问题,因为空终止的要求相同。

图像文件的第五个字节似乎与空终止字符具有相同的表示,但这并不意味着图像未被复制。

ifstream::gcount可用于查询读取字节数,ostream::write可用于输出可能包含或不包含空终止字符的字符数组的整个内容。

PS。虽然技术上是正确的,但创建动态对象并从函数返回裸指针是一个非常糟糕的主意。内存泄漏或其他错误很可能发生。我建议改用std::vector