Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: несовпадение типов FILE *f и ifstream(int)  (Прочитано 16507 раз)
0 Пользователей и 2 Гостей смотрят эту тему.
Kotiara
Постоялец

ua
Offline Offline

« : 28-01-2012 22:14 » 

Я пробовал написать простенькую программу которая должна открывать поток и привязывать к нему объект ifstream.
Код:
#include <iostream>
#include <fstream>

using namespace std;

int main(void)
{
  FILE *f;
  f = fopen("a.txt", "rt");
  ifstream in(*f);
  in.close();
}

Но программа не компилируется, долго искал причину и экспериментальным путем нашел следующее  «sizeof f»=8 а размер инта 4 байта (конструктор ifstream(int)).
Текст программы взял из примера в описании работы с файлами через fstream.
Я подозреваю что это из-за того что у меня 64 разрядная система но что делать с этим даже не догадываюсь, подскажите пожалуйста как решить эту проблему или хотя бы где искать решение.
« Последнее редактирование: 28-01-2012 22:17 от Kotiara » Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #1 : 28-01-2012 22:30 » new

Можно сделать так.
Код:
std::fstream os;
os.open("basic.dic", std::fstream::in);
Если используеш стиль std, так иcпользуй его до конца.

Кстати для FILE нужен инклуд stdio.h

Кстати, если судить по этому http://new.cplusplus.com/reference/iostream/ifstream/ifstream/ То ты не правильно используеш конструктор. Первый аргумент нуль-терминальная строка с именем файла. А не FILE.
« Последнее редактирование: 28-01-2012 22:37 от Finch » Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Kotiara
Постоялец

ua
Offline Offline

« Ответ #2 : 28-01-2012 22:39 » 

 У меня FILE работает без stdio.h хотя пробовал и с ним результат один, дело не в том что я не знаю как открыть файл я просто хочу потом подключить ifstream к потоку зи popen(), а от туда возвращается именно FILE. А эта прога скорее для проверки на точно работающем коде,  как я уже писал я этот код из манула скопипастил.)


Про конструкторы читал здесь http://www.object.newmail.ru/obj6.html
Цитата
Для типа ifstream имеется набор аналогичных конструкторов:
_RTLENTRY ifstream();
_RTLENTRY ifstream(const char _FAR *,int = ios::in,
                     int = filebuf::openprot);
_RTLENTRY ifstream(int);
_RTLENTRY ifstream(int __f, char _FAR *, int);
« Последнее редактирование: 28-01-2012 22:41 от Kotiara » Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #3 : 28-01-2012 22:41 » 

Я привел ссылку с описанием параметров контруктора. А кстати на просто FILE без инклуда компилятор должен ругаться на неопределенный тип. Сейчас твой пример ради интереса попробую откомпилировать и посмотреть на список ошибок.

Добавлено через 4 минуты и 5 секунд:
Странно, на FILE не отругался, но явно дал понять, что нет такого конструктора, у которого первый аргумент FILE&.
« Последнее редактирование: 28-01-2012 22:45 от Finch » Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Kotiara
Постоялец

ua
Offline Offline

« Ответ #4 : 28-01-2012 22:51 » 

у меня примерно тоже самое хотя я не раз находил примеры того что FILE грузят в конструктор ifstream один из выриантов которого принемает инт в качестве дискриптора потока.
Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #5 : 28-01-2012 22:56 » 

Скорее всего это наследие или Борланда или M$
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Kotiara
Постоялец

ua
Offline Offline

« Ответ #6 : 28-01-2012 23:04 » 

возможно что и наследие, но как тогда подружить функцию popen с ifstrem?
Это одна из первых попыток письма под линукс и мне нужно получить инфу через канал.
Popen показалась мне как раз тем что нужно, в смысле не нужно парится с синхронизацией и/или ожиданием завершения дочернего процесса да и с создание особых проблем нету.

Добавлено через 2 часа, 29 минут и 3 секунды:
Нашел свою ошибку(и не одну Улыбаюсь ) FILE по определению невозможно запихать в инт, нашел и решение функцию int fileno( FILE*). Но теперь у меня возникла другая проблема конструктора ifstream(int) и правда не существует в добавок оказалось что фукции fstream::attach тоже не существует. В связи с чем у меня закономерный вопрос можно ли вообще подключить объект fstream и его родственников к существующему потоку и если да то чем?
Хотя в общем уже не так важно я воспользовался стандартными фукциями из stdio.h
« Последнее редактирование: 29-01-2012 01:34 от Koriara » Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #7 : 29-01-2012 08:44 » 

А зачем вообще подключать один поток к другому? Объясни словами суть того, что ты хочешь написать.

Чтобы продублировать потоки нужно получить дескриптор файла через int fileno(FILE*), затем продублировать дескриптор через int dup(int) и открыть поток с полученным дескриптором через FILE* fdopen(int,cost char*).
« Последнее редактирование: 29-01-2012 08:47 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #8 : 29-01-2012 10:50 » 

Он хочет открыть нечто (как я понял pipe), но работать с ним через fstream. Он не знает, как открыть pipe через fstream, поэтому открывает его другими средствами, и имеет указатель FILE *. Спрашивает, как подцепить к этому открытому файлу fstream?

Не надо никакие fdopen, ему STL нужна.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #9 : 29-01-2012 12:27 » 

Дим, расскажи, как ты из написанного такое вывел? Или ты приобрел хрустальный шар новейшей модели?  :Улыбаюсь
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Kotiara
Постоялец

ua
Offline Offline

« Ответ #10 : 29-01-2012 14:42 » 

Спрашивает, как подцепить к этому открытому файлу fstream?
Похоже что вы знаете что я хочу спросить даже лучше чем я сам). Возможно от того что я действительно не знаю как открыть канал через fstream и открываю его через popen()
а он выдает FILE в качестве ответа.
Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #11 : 29-01-2012 18:51 » 

RXL, как только он во 2-м ответе упомянул popen, это стало очевидно Улыбаюсь А технология такая: сканируешь взглядом все написанные слова, не задумываясь, пока не встретишь что-нибудь особенное, за что мысль может зацепиться; потом на основе мысли строишь гипотезу и проверяешь остальной текст на соответствие ей; если соответствие есть, скорее всего автор это и имел в виду Улыбаюсь

Kotiara, я не знаю. Вот посмотри http://blog.eldruin.com/2011/04/inter-process-communication-pipe-fork-and-c-stl-streams/ , может мысли какие появятся. Тут опираются на GNU-расширение STL как раз для Unix.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Kotiara
Постоялец

ua
Offline Offline

« Ответ #12 : 29-01-2012 19:00 » 

DimkaСпасибо огромное а то я сколько не гуглил работа с каналами рассматривается только в контексте Си и ничего объектного вообще нету.
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines