Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Вывод переменной Byte в файл


Автор: sprinterv 15.6.2009, 01:31
Как вывести  переменную типа Byte  в файл?

Код

void testlog(int l, byte *p)
{
    // write to OUTLOG
    FILE *f = fopen(testout, "ab");

    if (fwrite(p, 1, l, f) != l)
        fatal("Can not write binary outlog");
    fclose(f);    
}


Так не выходит.

Автор: andrew_121 15.6.2009, 02:09
sprinterv, Пожалуйста, пользуйтесь тэгом code для исходных кодов.
Проверь, файл открывается?
Код

void testlog(int l, byte *p)
{
    // write to OUTLOG
    FILE *f = fopen(testout, "ab");
    if ( !f ) {
        fatal("Can not open outlog");
        return;
    }

    if (fwrite(p, 1, l, f) != l)
        fatal("Can not write binary outlog");
    fclose(f);    
}

Автор: sprinterv 15.6.2009, 02:37
Цитата(andrew_121 @ 15.6.2009,  02:09)
sprinterv, Пожалуйста. Пользуйтесь тэгом code для исходных кодов.
Проверь, файл открывается?
Код

void testlog(int l, byte *p)
{
    // write to OUTLOG
    FILE *f = fopen(testout, "ab");
    if ( !file ) {
       fatal("Can not open outlog");
    }

    if (fwrite(p, 1, l, f) != l)
        fatal("Can not write binary outlog");
    fclose(f);    
}

   
Код

         FILE *fpp;
    size_t countt;
    char const *strr = "hello \n";
    fpp = fopen("binlog","wb");
    countt = fwrite(strr,1, strlen(strr),fpp);
    fclose(fpp);


Этот код проверенно записывает строку в файл. 

Как аналогично записаить переменную типа Byte в файл?

Автор: andrew_121 15.6.2009, 02:39
Цитата(sprinterv @  15.6.2009,  02:37 Найти цитируемый пост)
Этот код проверенно записывает строку в файл.

Потому что, пример приведенный Вами, открывает файл для записи "wb"

Добавлено через 2 минуты и 15 секунд
А в функции testlog, файл открывается для дозаписи.
Вы проверили, файл открывается?

Автор: andrew_121 15.6.2009, 02:56
Если всеже он не открывается/создается. То по глобальной переменной errno можно получить код ошибки. А при помощи функции char* strerror(int), можно получить сообщение об ошибке в виде строки. И при помощи функции perror(const char*), его можно вывести в консоль.

Ссылки:
http://www.cplusplus.com/reference/clibrary/cerrno/
http://www.cplusplus.com/reference/clibrary/cstring/strerror/
http://www.cplusplus.com/reference/clibrary/cstdio/perror/

Автор: sprinterv 15.6.2009, 03:00
Цитата(andrew_121 @ 15.6.2009,  02:39)
Цитата(sprinterv @  15.6.2009,  02:37 Найти цитируемый пост)
Этот код проверенно записывает строку в файл.

Потому что, пример приведенный Вами, открывает файл для записи "wb"

Добавлено @ 02:41
А в функции testlog, файл открывается для дозаписи.
Вы проверили, файл открывается?

Первую часть кода я удалил. 
Но если отталкиваться от второго рабочего кода:

Код

   FILE *fpp;
    size_t countt;
    char const *strr = "hello \n";
    fpp = fopen("binlog","wb");
    countt = fwrite(strr,1, strlen(strr),fpp);
    fclose(fpp);


Как аналогично записать переменную типа Byte в файл? 



Автор: andrew_121 15.6.2009, 03:13
sprinterv, Именно так. У Вас все правильно!

Автор: sprinterv 15.6.2009, 03:17
Цитата(andrew_121 @ 15.6.2009,  03:13)
sprinterv, Именно так. У Вас все правильно!

andrew_121

Кусок кода что выше - работает правильно.  

Я не могу справиться с аналогичной задачей:

Как аналогично записать переменную типа Byte в файл? 

Добавлено через 3 минуты и 6 секунд
Все что мне нужно - это кусок кода, который будет записывать переменную типа byte в файл, 
аналогично приведенному примеру записи строковой переменной в файл 

Автор: andrew_121 15.6.2009, 03:26
sprinterv, Т.е. Если я Вас правильно понял, Вы хотите этот код вставить в функцию?
Если да, какие аргументы Вы планируете передавать функции?

Автор: andrew_121 15.6.2009, 03:49
Путем общения в ICQ, понял что требовалось.
Вот:
Код

struct submit_sm_pdu {
    byte data_coding;
};

void submit(struct submit_sm_pdu *w ) {
    w->data_coding = 245; /* octets */
    FILE *fpp = fopen("binlog","wb");
    size_t countt = fwrite(&w->data_coding, 1, sizeof(w->data_coding), fpp);
    fclose(fpp);


Автор: andrew_121 15.6.2009, 04:41
Оказывается, не все так просто. Все таки нужно было записать в файл строку бинарного содержания. Вот что получилось.
Код

const char* byte_to_binstr(char v, char* buf) {
    int i;
    for ( i = 0; i < sizeof(v)*8; i++ ) {
        buf[i] = (v >> i & 1)+'0';
    }
    buf[i] = 0;
    return buf;
}

void submit(struct submit_sm_pdu *w ) {
    FILE *fpp = fopen("binlog","wb");
    char buf[sizeof(w->data_coding)*8+1];
    fprintf(fpp, "%s", byte_to_binstr(w->data_coding, buf));
    fclose(fpp);


п.с.
Модераторы, добавьте к ключевым словам(если они там есть) слова "binary, бинарный"

Добавлено @ 04:53
Дополню. Версия для С++.
Код

template<typename T> std::string to_binstr(const T& v) {
    std::string result;
    result.resize(sizeof(v)*8);
    
    for ( int i = 0; i < sizeof(v)*8; i++ ) {
        result[i] = (v >> i & 1)+'0';
    }

    return result;
}

int main(int argc, char** argv) {

    char                    ch = 123;
    unsigned char        uch = 234;
    short                    sh = 2345;
    unsigned short        ush = 23456;
    int                    in = 234567;
    unsigned int        uin = 2345678;
    __int64                i64 = 23456789;
    unsigned __int64    ui64 = 234567890;
    /**/
    std::cout<< "char            : " << to_binstr(ch).c_str() << std::endl;
    std::cout<< "unsigned char   : " << to_binstr(uch).c_str() << std::endl;
    std::cout<< "short           : " << to_binstr(sh).c_str() << std::endl;
    std::cout<< "unsigned short  : " << to_binstr(ush).c_str() << std::endl;
    std::cout<< "int             : " << to_binstr(in).c_str() << std::endl;
    std::cout<< "unsigned int    : " << to_binstr(uin).c_str() << std::endl;
    std::cout<< "__int64         : " << to_binstr(i64).c_str() << std::endl;
    std::cout<< "unsigned __int64: " << to_binstr(ui64).c_str() << std::endl;
    /**/
    return 0;
}


Автор: xvr 15.6.2009, 17:52
Завершающий 0 у строки забыл

Автор: andrew_121 15.6.2009, 18:19
xvr, Вы имеете ввиду С-версию?
Поправил.

Автор: xvr 15.6.2009, 18:57
Цитата(andrew_121 @ 15.6.2009,  18:19)
xvr, Вы имеете ввиду С-версию?

Угу
Цитата

Поправил.
Не до конца, еще надо
Код

    char buf[sizeof(w->data_coding)*8+1];


Автор: andrew_121 15.6.2009, 19:08
xvr, Упс smile  Спасибо!

Автор: sprinterv 15.6.2009, 22:56
Спасибо большое,  andrew_121

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)