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


Автор: s0nik 22.10.2008, 19:29
Вывожу через stdout бинарный файл (изображение), всё нормально, но при выводе в поток вставляется символ 0x0D (вроде перевод каретки).
Как от него избавится?

Код

int main()
{
    FILE *f_in=NULL;
    char b;
    f_in=fopen("image.gif","rb");
    if (f_in==NULL) return -1; //ERROR !!!
    while (!feof(f_in)){
        fread(&b,1,1,f_in);
        fwrite(&b,1,1,stdout);
    };
    fclose(f_in);
    return 0;
}


Автор: ИванМ 22.10.2008, 20:36
Я запустил твою программу. Никакого символа 0xD не обнаружил. Единственно, что почему то дублируется последний символ. Почему я пока не понял.

Автор: J0ker 22.10.2008, 20:56
Цитата(s0nik @  22.10.2008,  19:29 Найти цитируемый пост)
Как от него избавится?

попробуйте
setmode(fileno(stdout), O_BINARY);
хотя с виндой нельзя быть уверенным что сработает

Добавлено через 1 минуту и 6 секунд
Цитата(ИванМ @  22.10.2008,  20:36 Найти цитируемый пост)
Я запустил твою программу. Никакого символа 0xD не обнаружил. 

это наверное потому, что вы ее на *nix'ах запустили   smile 

Автор: ИванМ 22.10.2008, 21:15
Про дубляж символа понял, а вот про 0xD нет. Просветите меня, в каком месте он должен появиться.
J0ker , у меня XP.

Автор: s0nik 22.10.2008, 21:52
Спасибо за помощь. setmode работает (а почему собственно не должно было работать в винде?)
Нашёл, где конкретно появляется символ 0x0D - всегда перед символом 0x0А.

Код

#include <stdio.h>
#include <io.h>
#include <fcntl.h>

using namespace std;

int main()
{
    setmode(fileno(stdout), O_BINARY);
    FILE *f_in=NULL;
    char b;
    f_in=fopen("image.gif","rb");
    if (f_in==NULL) return -1; //ERROR !!!
    while (1)
    {
        fread(&b,1,1,f_in);
        if(feof(f_in))
            break;
        fwrite(&b,1,1,stdout);
    };
    fclose(f_in);
    return 0;
}


Автор: ИванМ 22.10.2008, 22:02
Понятно. Просто у меня не было символа 10.

Автор: J0ker 22.10.2008, 22:30
Цитата(s0nik @  22.10.2008,  21:52 Найти цитируемый пост)
Спасибо за помощь. setmode работает (а почему собственно не должно было работать в винде?)

потому, что в винде файловые потоки и консольные потоки не равноправны насколько мне помнится...
Цитата(ИванМ @  22.10.2008,  22:02 Найти цитируемый пост)
Понятно. Просто у меня не было символа 10. 

для текстовых потоков символ конца строки в винде транслируется из \n в \r\n для вывода и наоборот для ввода

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