Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.08.2009, 16:04   #1
Dimarik
Форумчанин
 
Аватар для Dimarik
 
Регистрация: 18.04.2009
Сообщений: 688
По умолчанию представить картинку в двоичном коде

Добрый день! Мне необходимо представить картинку в двоичном коде.
я написал так:
Код:
#include <iostream.h>
#include <fstream>
main()
{
        ifstream fin("5.bmp",ios::binary);
        char p;
        fin.read((char*)&p, sizeof p);
        cin.get();
}
но мне это ничего не дало, мне кажется, что я что-то не так сделал в строке fin.read((char*)&p, sizeof p);
подредактируйте и объясните что не так, пожалуйста.
P.S. картинка находится в одной папке с программой
Dimarik вне форума Ответить с цитированием
Старый 14.08.2009, 16:19   #2
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

первый параметр - буфер, второй - размер.

Пример (копирование):
Код:
#include <iostream>
#include <fstream>
using namespace std;

int main()
{
        ifstream fin("1.bmp",ios::binary);
        ofstream fout;
        long len;
        char *p;

        fin.seekg(0,ios::end);
        len = fin.tellg();
        fin.seekg(0,ios::beg);
        p = new char[len+1];

        fin.read((char*)p, sizeof(char)*len);

        fout.open("2.bmp",ios::binary);
        fout.write((const char*)p,sizeof(char)*len);
        fout.close();
        fin.close();
        delete p;
        cin.get();

}
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 14.08.2009, 16:55   #3
Dimarik
Форумчанин
 
Аватар для Dimarik
 
Регистрация: 18.04.2009
Сообщений: 688
По умолчанию

поясните плиз что какой оператор делает:
fin.seekg(0,ios::end); len = fin.tellg(); fin.seekg(0,ios::beg);
Dimarik вне форума Ответить с цитированием
Старый 14.08.2009, 17:02   #4
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

fin.seekg(0,ios::end); // Перейти в конец файла
len = fin.tellg(); // Определить текущую позицию в файле
fin.seekg(0,ios::beg); // Перейти в начало файла
А всё вместе это определение размера файла
pu4koff вне форума Ответить с цитированием
Старый 14.08.2009, 19:04   #5
Dimarik
Форумчанин
 
Аватар для Dimarik
 
Регистрация: 18.04.2009
Сообщений: 688
По умолчанию

поясните, почему тут fin.read(p, sizeof(char)* len); а не так fin.read(p, sizeof(char*) len); какая разница между тем, где звёздочка будет.
первый вариант - приведение к типу, а второй умножение. то есть размер char умножаем на len. размер char 1, т.е. это действие бесмысленно, так что ли?
Dimarik вне форума Ответить с цитированием
Старый 14.08.2009, 19:09   #6
Dimarik
Форумчанин
 
Аватар для Dimarik
 
Регистрация: 18.04.2009
Сообщений: 688
По умолчанию

и ничего на экран не выводится
Код:
#include <iostream.h>
#include <fstream>
main()
{
        ifstream fin("5.bmp",ios::binary);
        ofstream fout;
        long len;
        char* p;
        fin.seekg(0,ios::end); //перемещает курсор в конец файла
        len = fin.tellg(); //подсчитывает сколько
        // символов от начала файла до положеня курсора
        fin.seekg(0,ios::beg);//перемещает курсор в начало файла
        p = new char[len+1];
        fin.read(p, sizeof(char)* len);
        fin.close();

        system("pause");
}
Dimarik вне форума Ответить с цитированием
Старый 14.08.2009, 19:23   #7
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

так вы ведь и не выводите )
можно например так:
Код:
for(int i = 0; i < sizeof(char)*len; i++)
    cout << " 0x" << hex << p[i];
весь листинг:
Код:
#include <iostream.h>
#include <fstream>
main()
{
        ifstream fin("5.bmp",ios::binary);
        ofstream fout;
        long len;
        char* p;
        fin.seekg(0,ios::end); //перемещает курсор в конец файла
        len = fin.tellg(); //подсчитывает сколько
        // символов от начала файла до положеня курсора
        fin.seekg(0,ios::beg);//перемещает курсор в начало файла
        p = new char[len+1];
        fin.read(p, sizeof(char)* len);
        for(int i = 0; i < sizeof(char)*len; i++)
            cout << " 0x" << hex << p[i];
        delete[] p; // Не забываем освобождать ресурсы!
        fin.close();

        system("pause");
}
Цитата:
поясните, почему тут fin.read(p, sizeof(char)* len); а не так fin.read(p, sizeof(char*) len); какая разница между тем, где звёздочка будет.
первый вариант - приведение к типу, а второй умножение. то есть размер char умножаем на len. размер char 1, т.е. это действие бесмысленно, так что ли?
Ну да, бесмысленно... ) Разве только дабы это работало на машинах, где тип char != 1 байт

Последний раз редактировалось netrino; 14.08.2009 в 19:31.
netrino вне форума Ответить с цитированием
Старый 14.08.2009, 20:06   #8
MaTBeu
Eclipse Foundation
Старожил
 
Аватар для MaTBeu
 
Регистрация: 19.09.2007
Сообщений: 2,604
По умолчанию

Если написать
Код:
fin.read(p, sizeof(char*) len);
Будет ошибка компиляции, потому что char * это указатель на char, а len в данном случае вообще неожидаемые символы.
Если же написать
Код:
fin.read(p, sizeof(char)*len);
то будет считано len символов типа char.

Ощущаете разницу?
MaTBeu вне форума Ответить с цитированием
Старый 15.08.2009, 14:11   #9
Dimarik
Форумчанин
 
Аватар для Dimarik
 
Регистрация: 18.04.2009
Сообщений: 688
По умолчанию

Код:
#include <iostream.h>
#include <fstream>
main()
{
        ifstream fin("5.bmp",ios::binary);
        ofstream fout;
        long len;
        char* p;
        fin.seekg(0,ios::end); //перемещает курсор в конец файла
        len = fin.tellg(); //подсчитывает сколько
        // символов от начала файла до положеня курсора
        fin.seekg(0,ios::beg);//перемещает курсор в начало файла
        p = new char[len+1];
        fin.read(p, sizeof(char)* len);
        for (int i=0;i<sizeof(char)*len;i++)
                cout<<hex<<p[i];
        fin.close();

        system("pause");
}
в результате работы программы выводятся какие-то некорректные символы, вот так выводится всё нормально, но надо представить в шестнадцатеричном или двоичном коде:
Код:
#include <iostream.h>
#include <fstream>
main()
{
        ifstream fin("5.bmp",ios::binary);
        ofstream fout;
        long len;
        char* p;
        fin.seekg(0,ios::end); //перемещает курсор в конец файла
        len = fin.tellg(); //подсчитывает сколько
        // символов от начала файла до положеня курсора
        fin.seekg(0,ios::beg);//перемещает курсор в начало файла
        p = new char[len+1];
        fin.read(p, sizeof(char)* len);
        for (int i=0;i<sizeof(char)*len;i++)
                cout<<int(p[i]);
        fin.close();

        system("pause");
}
разница заключается в cout<<int(p[i]); и cout<<p[i];
Dimarik вне форума Ответить с цитированием
Старый 15.08.2009, 14:12   #10
Dimarik
Форумчанин
 
Аватар для Dimarik
 
Регистрация: 18.04.2009
Сообщений: 688
По умолчанию

и скажите плиз, что означает "-"???
в коде bmp в 10-ричном отображении
в 16-ричном так cout<<hex<<int(p[i]);
а как в двоичном и 8-ричном?
Dimarik вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Хранение текста в двоичном файле Nitrino Общие вопросы C/C++ 63 04.06.2009 02:46
Десятичные дроби в двоичном виде Ukrajinec Помощь студентам 2 13.04.2009 11:29
Вывод байта в двоичном пердставлении (С++) trollik Помощь студентам 6 01.09.2008 23:55
Необходимо представить десятичное число в двоичном виде Xardas Паскаль, Turbo Pascal, PascalABC.NET 2 26.01.2008 00:54