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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> вывод строки в файл 
:(
    Опции темы
GoldFinch
Дата 15.6.2009, 22:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

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



есть файловый поток
Код

    using namespace std;
    out.open(filename,ios_base::out);
    out<<right<<hex<<setfill('0')<<noshowbase<<uppercase;

при попытке вывести туда char* выводится адрес строки а не строка
Код

    int* arg=arglist;
...
        case 's': out<<reinterpret_cast<const char*>(*arg); break;


помогло 
Код

        case 's': 
            {
                string s=reinterpret_cast<const char*>(*arg);
                for(string::const_iterator i=s.begin(),e=s.end();i!=e;++i)
                    out<<*i;
            } break;

но хотелось бы как попроще
PM MAIL ICQ   Вверх
Cheloveck
Дата 15.6.2009, 23:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1578
Регистрация: 26.7.2008
Где: Тула

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



Код

char* arg=arglist;

не поможет? честно говоря, ты такой маленький кусок привёл, что ничего не понятно, что ты делаешь.


--------------------
user posted image
PM Jabber   Вверх
ller
Дата 15.6.2009, 23:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 325
Регистрация: 4.8.2008
Где: г. Таганрог

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



Код

copy(vi.begin(),vi.end(),ostream_iterator<double>(cout,", "));

Можно еще так, только cout заменить на нужный поток.
PM MAIL   Вверх
GoldFinch
Дата 15.6.2009, 23:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

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



Cheloveck, какая разница что делает весь код %)

Код

//перехватывается SendPacket(int a1,char* format, ...)

void __cdecl SendPacketHook(int a1,char* format,int varargs)
{
        SendDump(format,&varargs);
        __asm pop ebp 
        __asm jmp [OriginalSendPacketPtr]
}

void SendDump(char* format,int* arglist)
{
        using namespace std;
        out<<format<<endl;      
        char* fmt=format;
        int* arg=arglist;
        for (int i=0, n=strlen(format);i<n;++i,++fmt,++arg)
        {
                out<<" "<<setw(2)<<i<<") "<<*fmt<<": ";
                switch (*fmt)
                {
                case 'c': out<<setw(2)<<static_cast<int>(static_cast<unsigned char>(*arg));     break;
                case 'h': out<<setw(4)<<static_cast<short>(*arg);               break;
                case 'd': out<<setw(8)<<static_cast<short>(*arg);               break;
                case 'f': out<<dec<<static_cast<float>(*arg)<<hex;              break;
                case 'Q': out<<setw(16)<<static_cast<__int64>(*arg);    break;
                case 's': 
                        {
                                out<<"\"";
                                string s=reinterpret_cast<const char*>(*arg);
                                for(string::const_iterator i=s.begin(),e=s.end();i!=e;++i)
                                        out<<*i;
                                out<<"\"";
                        } break;
...

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


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

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



ller, Да, и double на char smile

Добавлено через 1 минуту и 53 секунды
Цитата(GoldFinch @  15.6.2009,  22:57 Найти цитируемый пост)

string s=reinterpret_cast<const char*>(*arg);
for(string::const_iterator i=s.begin(),e=s.end();i!=e;++i)
  out<<*i;

Это что за изврат smile

Добавлено через 2 минуты и 47 секунд
Код

cout << reinterpret_cast<const char*>(*arg) << endl;



--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
GoldFinch
Дата 16.6.2009, 00:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

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



andrew_121, там не cout, и reinterpret_cast<const char*>(*arg) не помогает
PM MAIL ICQ   Вверх
Cheloveck
Дата 16.6.2009, 00:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1578
Регистрация: 26.7.2008
Где: Тула

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



Код

void SendDump(char* format,int* arglist)

Я так пологаю, у тебя что-то вроде printf, тогда проще использовать неопределённые параметры, проблем не возникнет.

Добавлено через 1 минуту и 1 секунду
Код

void SendDump(char* format, ...)

так везде делают


--------------------
user posted image
PM Jabber   Вверх
andrew_121
Дата 16.6.2009, 00:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

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



Цитата(GoldFinch @  16.6.2009,  00:03 Найти цитируемый пост)
там не cout

Производный от std::fstream ?




Цитата(GoldFinch @  16.6.2009,  00:03 Найти цитируемый пост)
и reinterpret_cast<const char*>(*arg) не помогает 

Как не помогает?
В твоем коде ты приводишь к типу const char*, и его передаешь в std::string. После чего, в цикле, разименовываешь итератор, и выводишь по одному символу.
Что не так?

Добавлено @ 00:23
Цитата(Cheloveck @  16.6.2009,  00:08 Найти цитируемый пост)
Я так пологаю, у тебя что-то вроде printf, тогда проще использовать неопределённые параметры, проблем не возникнет.

И правда. Велосипед.
Почему бы стандартную функцию не использовать?
Или что-то вроди:
Код

std::string my_sprintf( const char* format, ... ) {
      std::string result;
      result.resize(4096);
      va_list ap;
      va_start( ap, format );
      vsprintf( (char*)result.c_str(), format, ap );
      va_end( ap );
      return result;
}


Это сообщение отредактировал(а) andrew_121 - 16.6.2009, 00:26


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
ller
Дата 16.6.2009, 00:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 325
Регистрация: 4.8.2008
Где: г. Таганрог

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



А почему не использовать тогда fprintf()?
PM MAIL   Вверх
andrew_121
Дата 16.6.2009, 00:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

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



Об этом нужно GoldFinch спросить.


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
ller
Дата 16.6.2009, 00:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 325
Регистрация: 4.8.2008
Где: г. Таганрог

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



Тогда не надо и огород городить такой сложный, вернее велосипед  smile 
PM MAIL   Вверх
Lazin
Дата 16.6.2009, 08:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

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



GoldFinch, хранить указатели на данные в переменной типа int - очень, очень плохо. Если он туда помещается, это не значит что так можно делать. smile 
Если пишешь под windows, то используй UINT_PTR, иначе твой код будет не переносим, даже в рамках windows smile 
оператор << класса ofstream, выводит const char* как строку, не как указатель
в общем, я понятия не имею, что ты сделал, что-бы получить такое поведение от ostream, попробуй упростить код, к примеру заведи переменную const char* p и присвой ей нужное значение, а потом выводи ее в поток, по крайней мере сможешь посмотреть отладчиком ее значение
кстати, строку типа std::string, можно вывести в поток целиком, ее не нужно передавать туда посимвольно, впрочем так-же как и обычную строку...
PM MAIL Skype GTalk   Вверх
GoldFinch
Дата 16.6.2009, 18:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

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



Lazin, этот код взаимодействует с существующим 32-разрядным бинарником, поэтому все там нормально с размерами указателей.

задача такая - перехватывается функция void SendPacket(int a1,char* format, ...)
пример значений ее параметров -
  char c1; int d1; 
  SendPacket(xxx,"cdS",  c1, d1, L"qwerty" );

format - комбинация символов chdQsSfb соответствующих типам параметров

в 32разрядном коде, в винде, переменный список параметров - это массив 4-байтовых значений или указателей, 
соответственно функция перехвата состоит из обертки передающей формат и указатель на переменный список параметров в функцию выполняющую полезные действия.
Код

void __cdecl SendPacketHook(int a1,char* format,int varargs)
{
        SendDump(format,&varargs);
        __asm pop ebp 
        __asm jmp [OriginalSendPacketPtr]
}


Добавлено через 6 минут и 24 секунды
нашел почему строка не выводилась в поток - не был подключен <string> %)

PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


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

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


 




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


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

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