Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблемы с чтением бинарного файла (jpg) 
:(
    Опции темы
php5
Дата 13.8.2013, 17:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 272
Регистрация: 15.8.2007

Репутация: нет
Всего: нет



Нужно  прочитать содержание бинарного файла в  частности  рисунок  в jpg
Для этого написал функцию 
Код

char* readFile(string file) {
    string str = "";
    char* buf; 
        ifstream f(file.c_str(),ios_base::in|ios_base::binary|ios::ate);
    if (f.is_open() && f.good()) {
           long size = f.tellg();
           f.seekg(0, ios::beg);
       buf = new char[size];
       memset(buf, 0, size);
       f.read(buf, size);
       f.close();
    }
    return buf;
}  

Но на выходе почему то получаю  строку  яШяб3эExif  хотя если попытаться прочитать данной функцией текстовый файл то все ок 


Это сообщение отредактировал(а) php5 - 13.8.2013, 17:04
PM MAIL   Вверх
SenkraD
Дата 13.8.2013, 17:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 933
Регистрация: 3.2.2006
Где: Украина::Киев

Репутация: 2
Всего: 23



дебагер читает ее как С-строку, тоесть при первом \0 обрывает показ, а по сему тебе необходимо еще и size возвращать чтобы можно было работать дальше или использовать std::vector<unsigned char> или std::string, если у тебя С++11, если нет, то возвращать их будет накладно, а по сему придется передавать по ссылке, хотя можно и так замутить std::vector const& read(std::string, std::vector)

Это сообщение отредактировал(а) SenkraD - 13.8.2013, 17:27


--------------------
 Имеющий язык - да не убоится спросить! 
user posted image
PM MAIL ICQ   Вверх
php5
Дата 13.8.2013, 21:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 272
Регистрация: 15.8.2007

Репутация: нет
Всего: нет



Ну  вроде бы  получилось  прочитать весь файл 
Код

char* readFile(string file) {
    char* buf; 
    ifstream f(file.c_str(),ios_base::in|ios_base::binary|ios::ate);
    if (f.is_open() && f.good()) {
        vector<char> data(f.tellg());
      f.seekg(0, ios::beg);
        f.read(&data[0], data.size());
      f.close();
    }    
    return buf; 
} 

Теперь возникает вопрос  как  vector<char>  преоброзовать в char*  дабы можно было  сохранит 
Код

void save(char* buf) {    
    FILE *file;
    char* file_name = "D:\\img.jpg";
    file = fopen(file_name, "wb"); 
    fputs(buf, file);
    fclose(file);
}


PM MAIL   Вверх
SenkraD
Дата 13.8.2013, 23:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 933
Регистрация: 3.2.2006
Где: Украина::Киев

Репутация: 2
Всего: 23



собсвенно как-то так:
Код

#include <vector>
#include <fstream>


std::vector<char>& load_file(std::string const& filename, std::vector<char>& buffer)
{
    buffer.clear();
    
    std::ifstream file(filename.c_str(), std::ios::binary);
    if (file.bad())
    {
        return buffer;
    }

    char symbol;
    buffer.reserve(static_cast<std::string::size_type>(file.rdbuf()->in_avail()));
    while (file.get(symbol))
    {
        if (buffer.capacity() == buffer.size())
        {
            buffer.reserve(buffer.capacity() * 3);
        }
        buffer.push_back(symbol);
    }

    return buffer;
}

void save_file(std::string const& filename, std::vector<char> const& buffer)
{
    std::ofstream file(filename.c_str(), std::ios::binary | std::ios::trunc);
    if (file)
    {
        file.write(&buffer[0], buffer.size());
    }
}


или можно сделать более лаконично на std::copy, стримовых итерараторах и std::back_inserter
Код

#include <vector>
#include <fstream>
#include <iterator>
#include <algorithm>

std::vector<char>& load_file(std::string const& filename, std::vector<char>& buffer)
{
    std::ifstream file(filename.c_str(), std::ios::binary);

    buffer.clear();
    buffer.reserve(static_cast<std::string::size_type>(file.rdbuf()->in_avail()));
    std::copy(
          std::istream_iterator<char>(file)
        , std::istream_iterator<char>()
        , std::back_inserter(buffer)
    );

    return buffer;
}

void save_file(std::string const& filename, std::vector<char> const& buffer)
{
    std::ofstream file(filename.c_str(), std::ios::binary | std::ios::trunc);
    std::copy(
          buffer.begin()
        , buffer.end()
        , std::ostream_iterator<char>(file)
    );
}


Это сообщение отредактировал(а) SenkraD - 13.8.2013, 23:01


--------------------
 Имеющий язык - да не убоится спросить! 
user posted image
PM MAIL ICQ   Вверх
php5
Дата 14.8.2013, 09:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 272
Регистрация: 15.8.2007

Репутация: нет
Всего: нет



Спасибо SenkraD !
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0436 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.