Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
seelenus
0 / 0 / 1
Регистрация: 07.07.2011
Сообщений: 36
#1

fopen и fdopen - C++

15.03.2013, 15:06. Просмотров 936. Ответов 6
Метки нет (Все метки)

Помогите, пожалуйста, разобраться.
Есть код скрипта, выводит картинку в браузере, скачал с инета:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
// Результат работы скрипта - оторбажение картинки.
#include <stdio.h> 
 
// Возвращает размер открытого файла.
long filesize(FILE *f) { 
  long pos, size;
  pos = ftell(f); 
  fseek(f, 0, 2); 
  size = ftell(f); 
  fseek(f, pos, 0); 
  return size; 
} 
 
void main(void) {
  // Открываем потоки в режиме бинарного чтения и записи (обязательно!).
  FILE *f = fopen("test.gif", "rb");
  FILE *st = fdopen(fileno(stdout), "wb");  //строка, которуюпредлагаю заменить
  // Выводим необходимые заголовки. 
  fprintf(st, "Pragma: no-cache\r\n");
  fprintf(st, "Content-type: image/gif\r\n");
  fprintf(st, "Content-length: %d\r\n", filesize(f));
  fprintf(st, "\r\n");
  // Печатаем картинку блоками по 4000 байт.
  while (1) {
    char s[4000+1];
    int size = fread(s, 1, 4000, f);
    if (!size) break;
    fwrite(s, size, 1, st);
  }
}
Хочу понять почему в данном коде надо второй раз связывать уже другой поток st с файлом test.gif с помощью функции fdopen, и почему не работает, если его открыть второй раз вот так: FILE *st = fopen("test.gif", "wb").
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.03.2013, 15:06
Я подобрал для вас темы с готовыми решениями и ответами на вопрос fopen и fdopen (C++):

fopen
Добрый день! Мне нужно было сохранить данные в текстовый файл. Для открытия...

fopen()
Win XP SP2, VS 2005 не могу понять, почему fopen() не работает? Просмотрел в...

вопрос по fopen
Вечер добрый. стандартно для открытия файла пользуюсь fopen, сейчас появилась...

Fopen в vs 2013
Привет! разбирался с фалами, и пришел к тупику. Пожалуйста, подскажите, что не...

Функция fopen
Здравствуйте. Я студент, изучаю язык программирования с++. У меня возникла...

Функция fopen
Добрый день правильно ли я думаю, что если в функции fopen поставив флаги w+b,...

6
Tulosba
:)
Эксперт С++
4746 / 3240 / 496
Регистрация: 19.02.2013
Сообщений: 9,046
16.03.2013, 10:26 #2
Вы, по-моему, не поняли что тут происходит, если предлагаете второй раз открывать картинку. По факту тут происходит копирование картинки с дополнением нужными http заголовками в стандартный поток вывода stdout. Дополнительно по теме можно ознакомиться с технологией cgi.
1
seelenus
0 / 0 / 1
Регистрация: 07.07.2011
Сообщений: 36
16.03.2013, 10:53  [ТС] #3
Нет, я не пойму почему надо использовать fdopen в приведенном коде, а не fopen. Тут же получается, что файл test.gif открывается сначала для бинарного чтения ("rb"), а потом для бинарной записи ("wb"). У меня проблема с пониманием работы функциями fopen и fdopen. Весь инет излазил, прочитал все про эти функции, но не так и не понял почему поток st тут надо связывать с дескриптором файла test.gif с помощью функции fdopen, а не использовать для потока st функцию fopen: fopen("test.gif", "wb"). Работу с потоками, короче, не пойму.
0
Tulosba
:)
Эксперт С++
4746 / 3240 / 496
Регистрация: 19.02.2013
Сообщений: 9,046
16.03.2013, 11:39 #4
Цитата Сообщение от seelenus Посмотреть сообщение
Нет, я не пойму почему надо использовать fdopen в приведенном коде, а не fopen. Тут же получается, что файл test.gif открывается сначала для бинарного чтения ("rb"), а потом для бинарной записи ("wb"). У меня проблема с пониманием работы функциями fopen и fdopen. Весь инет излазил, прочитал все про эти функции, но не так и не понял почему поток st тут надо связывать с дескриптором файла test.gif с помощью функции fdopen, а не использовать для потока st функцию fopen: fopen("test.gif", "wb"). Работу с потоками, короче, не пойму.
fopen открывает картинку на чтение;
fdopen связывает стандартный поток вывода stdout со структурой FILE.
Потом fprintf и fwrite используются для вывода в стандартный поток вывода.
1
seelenus
0 / 0 / 1
Регистрация: 07.07.2011
Сообщений: 36
16.03.2013, 11:54  [ТС] #5
Цитата Сообщение от Tulosba Посмотреть сообщение
fopen открывает картинку на чтение;
fdopen связывает стандартный поток вывода stdout со структурой FILE.
Потом fprintf и fwrite используются для вывода в стандартный поток вывода.
Но ведь функция fopen, насколько я понял, тоже связывает файл с потоком и структурой FILE? Прочитал описание функции fopen в инете: FILE * fopen(char * filename, char * type); Функция fopen открывает файл, именованный параметром filename и связывает его с соответствующим потоком stream.
0
Tulosba
:)
Эксперт С++
4746 / 3240 / 496
Регистрация: 19.02.2013
Сообщений: 9,046
16.03.2013, 16:40 #6
Короче, можно выкинуть fdopen() и использовать вместо st везде stdout.
1
seelenus
0 / 0 / 1
Регистрация: 07.07.2011
Сообщений: 36
17.03.2013, 13:13  [ТС] #7
Кажется начинаю разбираться в этом. Спасибо, Tolusba
0
17.03.2013, 13:13
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.03.2013, 13:13
Привет! Вот еще темы с решениями:

FOPEN не то открывает
помогите у меня FOPEN открывает файл It is an example using fseek and ftell...

Работа с файлами fopen
Программа запускается нормально, выскакивает предупреждение об использовании...

Что-то не так с fopen
Что компилятор хочить в fopen? Вот например что здесь не так? void...

Fopen не создает файл
Перешел на Visual Studio 2013, столкнулся с проблемой: взят обычный код из...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru