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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 15.08.2009, 15:31   #11
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Цитата:
Сообщение от Dimarik
в коде bmp в 10-ричном отображении
в 16-ричном так cout<<hex<<int(p[i]);
а как в двоичном и 8-ричном?
Меняется только строчка
Код:
cout<<int(p[i]);
В десятичной:
Код:
cout<<(unsigned int)p[i]; // dec
В шестнадцатиричной:
Код:
cout<<hex<<(unsigned int)p[i]; //hex
В восьмеричной:
Код:
cout<<oct<<(unsigned int)p[i]; //oct
В двоичной:
Код:
int a = 1;
            for(int j=0; j<8; j++)
             {
              if((int)p[i]&a) cout<<1;
              else cout<<0;
              a<<=1;
             }
            cout<<endl;
           }
(если не напутал с порядком вывода битов).
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

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

вопрос малость отходит от темы, но тем не менее он не требует долгих рассуждений. текст программы тот же самый, только я попытался таким образом открыть не картинку, а mp3 файл. В результате - программа очень долго показывала различные цифры, около минуты, я даже подумал, что произошло зацикливание программы, но в итоге я увидел лишь последние нули (в начале другие числа были), в конце концов на экране остались одни нули. Хочется спросить почему это так? потому что консольке не хватило памяти запомнить всё, что там находилось?
вот текст
Код:
#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 (unsigned int i=0;i<sizeof(char)*len;i++)
                cout<<hex<<int(p[i])<<endl;
        fin.close();

        system("pause");
}
в выводе испольщзовал endl чтоб было удобней читать

Последний раз редактировалось Dimarik; 15.08.2009 в 16:28.
Dimarik вне форума Ответить с цитированием
Старый 15.08.2009, 16:37   #13
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Программа вывела содержимое файла. Как вы и хотели.
Для наглядности можете изменить цикл вывода вот так:
Код:
for (unsigned int i=0;i<sizeof(char)*len;i++)
              {
               cout<<dec<<i<<"  ";  // выводим номер выводимого байта
               cout<<hex<<int(p[i])<<endl;
              }
Нули, видимо, из-за структуры mp3-файла.

И еще: освобождайте память!
Код:
delete[] p;
За вас это никто делать не будет.
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 15.08.2009, 17:24   #14
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 (unsigned int i=0;i<sizeof(char)*len;i++)
                cout<<hex<<int(p[i]);
        fin.close();
        delete []p;
        fout.open("2.bmp", ios::binary);
        fout.write((char*)p, sizeof(char)*len);
        for (unsigned int i=0;i<sizeof(char)*len;i++)
        int(p[i])+=5;
        delete []p;
        system("pause");
}
и даже если я потом проведу ещё одно выполнение программы, только в обратном направлении, т.е. int(p[i])-=5; картинку я всё равно не открою. почему? мне её закодировать надо.
когда 2 строчку иначе напишу - никаких действий с картинкой не происходит
fout.write(p, sizeof(char)*len);

Последний раз редактировалось Dimarik; 15.08.2009 в 17:28.
Dimarik вне форума Ответить с цитированием
Старый 15.08.2009, 19:16   #15
Dimarik
Форумчанин
 
Аватар для Dimarik
 
Регистрация: 18.04.2009
Сообщений: 688
По умолчанию

а что думаете по поводу этой строки? может в не ошибка?
fout.write((char*)&p, sizeof(char)*len);// ЗДЕСЬ РАЗНИЦА потому что в одном случае есть результат. в другом - нет


я ещё думал про один случай. если открываешь картинку как текст и вносишь какое-то изменение, например добавляешь в конце какой-то символ, затем открываешь картинку - она не открывается и это понятно, но дальше убираешь сделанное ранее изменение и сохраняешь и открываешь картинку, а она всё равно не открывается.
может с этим как-то связано?
и алгоритм неправильный? но почему он не правильный? я ж как двоичный файл открываю...
Dimarik вне форума Ответить с цитированием
Старый 15.08.2009, 23:47   #16
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Картинку-то вы считываете, но перед открытием выходного файла память под нее очищаете:
Код:
   fin.close();
        delete []p;
        fout.open("2.bmp", ios::binary);
и еще:
Код:
int(p[i])+=5;
Нельзя приводить тип в левой части.

И еще: если уж вы хотите картинку закодировать, то логично будет вносить в нее изменения до записи в файл )
Код:
 fout.write((char*)p, sizeof(char)*len);
        for (unsigned int i=0;i<sizeof(char)*len;i++)
        int(p[i])+=5;
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 16.08.2009, 11:57   #17
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 (unsigned int i=0;i<sizeof(char)*len;i++)
                cout<<hex<<int(p[i]);
        fin.close();
        fout.open("2.bmp", ios::binary);
         fout.write((char*)&p, sizeof(char)*len);
        for (unsigned int i=0;i<sizeof(char)*len;i++)
        p[i]+=5;
        delete[]p;
        system("pause");
}
в итоге не работает (файл не открывается после шифровки и после дешифровки тоже не открывается.
причём так происходят изменения с файлом fout.write((char*)&p, sizeof(char)*len);
а так нет
fout.write(p, sizeof(char)*len);
почему?

Последний раз редактировалось MaTBeu; 16.08.2009 в 16:09.
Dimarik вне форума Ответить с цитированием
Старый 16.08.2009, 18:04   #18
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Сравните две строчки и найдите одно отличие.
ваш вариант:
Код:
 fout.write((char*)&p, sizeof(char)*len);
мой:
Код:
 fout.write((char*)p, sizeof(char)*len);
Чувствуете разницу?

Цитата:
в смысле? что ты имеешь в виду? можно поподробней?
Имею в виду, что вы кодируете
Код:
p[i]+=5;
уже после того, как картинка переписана в другой файл. Поэтому все старания напрасны.
Поместите цикл до записи в файл 2.bmp.
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 16.08.2009, 21:24   #19
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 (unsigned int i=0;i<sizeof(char)*len;i++)
                cout<<hex<<int(p[i]);
        fin.close();
        fout.open("2.bmp", ios::binary);
        for (unsigned int i=0;i<sizeof(char)*len;i++)
        p[i]+=5;
        fout.write((char*)&p, sizeof(char)*len);
        delete[]p;
        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 (unsigned int i=0;i<sizeof(char)*len;i++)
                cout<<hex<<int(p[i]);
        fin.close();
        fout.open("2.bmp", ios::binary);
        for (unsigned int i=0;i<sizeof(char)*len;i++)
        p[i]-=5;
        fout.write((char*)&p, sizeof(char)*len);
        delete[]p;
        system("pause");
}
и картинка не открылась. и это уже нельзя объяснить, по крайней мере я не могу. Sazary, я ощущаю разницу, какую вы говорите, но я не ощущаю разницу между этим

fout.write((char*)&p, sizeof(char)*len);
и этим
fout.write(p, sizeof(char)*len);
Dimarik вне форума Ответить с цитированием
Старый 16.08.2009, 21:40   #20
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Естественно, не открылась. Вы в обоих случаях открываете файл "5.bmp". И в обоих же случаях файл "2.bmp" оказывается зашифрован.

Цитата:
Sazary, я ощущаю разницу, какую вы говорите, но я не ощущаю разницу между этим

fout.write((char*)&p, sizeof(char)*len);
и этим
fout.write(p, sizeof(char)*len);
p - уже сам по себе указатель на первый элемент массива символов. Не нужно амперсанда. И еще: по-хорошему нужно все-таки приводить типы, т.к. метод read работает с char*:
Код:
istream& read ( char* s, streamsize n );
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 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