2017-02-08 7 views
-2

Я пытаюсь скопировать изображение в массив символов. Это похоже на пример документации, но работает неправильно. Что случилось с кодом ниже?Почему этот код не копирует изображение в массив символов?

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 
+3

Ваше изображение, скорее всего, не является ничейной строкой. 'std :: strlen' просто задыхается от первого нулевого байта, а' std :: cout' также не сможет отобразить ничего значимого. – Quentin

+0

Вы указали вывод своей программы. Это выглядит неплохо. Вы ожидали, что он выведет что-нибудь еще? – anatolyg

+0

Длина изображения - 'n', а не' strlen (res) '. Вот где твоя ошибка. – PaulMcKenzie

ответ

1

Ваше тестовое изделие неисправно. strlen требует, чтобы аргумент представлял собой строку с нулевым завершающим символом и возвращал количество ненулевых символов перед встречей с первым нулем. Я не знаю форматов изображений, которые завершены с нулевым значением, поэтому ваш массив символов, вероятно, не будет содержать никаких символов нулевого окончания.

Ввод res в выходной поток (например, cout) также является неисправным из-за того же требования о нулевом завершении.

Похоже, что пятый байт вашего файла изображения имеет то же представление, что и символ нулевого завершения, но это не означает, что изображение не было скопировано.

ifstream::gcount может использоваться для запроса количества прочитанных байтов, а ostream::write может использоваться для вывода всего содержимого символьного массива, который может содержать или не содержать символы нулевого окончания.


PS. Хотя технически корректно, очень сложно создавать динамические объекты и возвращать пустой указатель из этой функции. Утечки памяти или другие ошибки очень вероятны. Вместо этого я рекомендую использовать std::vector.