2016-04-16 6 views
2

У меня проблема с чтением изображения из файла, но когда есть сырой текст, он работает правильно. Я читал, что любой файл может быть прочитан в двоичном режиме, но мой вывод выглядит следующим образом: \ FF \ D8 \ FF \ E0, а затем он останавливается. Он останавливается у этого персонажа, поэтому я не уверен, что он просто не может разрешить этот персонаж или что-то еще. Кто-нибудь знает, что не так? Заранее спасибо.Чтение изображений из файла - C++

Вот мой код

char* obsah; 
std::string sprava; 
std::ifstream is (file.c_str(), std::ifstream::binary); 
    if(is){ 
     is.seekg (0, is.end); 
     int length = is.tellg(); 
     is.seekg (0, is.beg); 
     obsah = new char [length]; 
     is.read(obsah,length); 
     sprava = prepinac+"\r\n"+file+"\r\n\r"+obsah; 
    } 
    else exit(EXIT_FAILURE); 
+0

вы проявили длину? где выход? как определяются обна и препинант? – Christophe

+0

char * obsah; std :: string preinac, sprava .. И у меня длина длиннее 1000. –

ответ

2

sprava является строкой. Поскольку вы используете + для объединения его компонентов, он управляет char* obsah как завершающая нуль c-строка. Итак, все после первого нулевого символа не будет скопировано в sprava.

Edit:

Вы можете иметь двоичные данные, в том числе '\0' в строках (см here). Однако вы должны быть очень осторожны в этом подходе, потому что всякий раз, когда вы конвертируете свою строку в указатель char*, который обрабатывается как строка с нулевым завершением, часть строки может быть проигнорирована. И если вы используете свою строку в I/O, это может также дать странные результаты.

Если вы хотите продолжить, вы можете использовать std::copy() и back inserter;

sprava = prepinac+"\r\n"+file+"\r\n\r"; 
    copy(obsah, obsah+length, back_inserter<string>(sprava)); 

Здесь online demo

+0

ОК, так что же было бы резонным решением? –

+0

Управление нулевыми символами в строке возможно, но вам придется проявлять особую заботу о любых нестроковых функциях, преобразованиях в c-строку и ввода-вывода (см. [Здесь] (http://stackoverflow.com/questions/7416539/Is-The-stdstring-может-держать-0-символ за дизайн)). Одним из возможных решений было бы скопировать obsah в sprava с помощью 'std :: copy()' (либо resize() sprava до того, как это будет достаточно для копирования, либо использовать back inserter) – Christophe

+0

@ Pavolmodrý Я сделал изменить, чтобы объяснить более подробно – Christophe

Смежные вопросы