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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Бинарный stdout 
:(
    Опции темы
s0nik
Дата 22.10.2008, 19:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 22.8.2008

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



Вывожу через 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;
}



Это сообщение отредактировал(а) s0nik - 22.10.2008, 19:29
PM MAIL   Вверх
ИванМ
Дата 22.10.2008, 20:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 1
Всего: 23



Я запустил твою программу. Никакого символа 0xD не обнаружил. Единственно, что почему то дублируется последний символ. Почему я пока не понял.
PM MAIL   Вверх
J0ker
Дата 22.10.2008, 20:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 986
Регистрация: 17.9.2008

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



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

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

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

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


--------------------
user posted image
PM MAIL   Вверх
ИванМ
Дата 22.10.2008, 21:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 1
Всего: 23



Про дубляж символа понял, а вот про 0xD нет. Просветите меня, в каком месте он должен появиться.
J0ker , у меня XP.

Это сообщение отредактировал(а) ИванМ - 22.10.2008, 21:16
PM MAIL   Вверх
s0nik
Дата 22.10.2008, 21:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 22.8.2008

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



Спасибо за помощь. 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;
}


PM MAIL   Вверх
ИванМ
Дата 22.10.2008, 22:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 1
Всего: 23



Понятно. Просто у меня не было символа 10.
PM MAIL   Вверх
J0ker
Дата 22.10.2008, 22:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 986
Регистрация: 17.9.2008

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



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

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

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


--------------------
user posted image
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

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

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


 




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


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

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