Как получить FILE* по int хэндлу.?
От: Аноним  
Дата: 28.06.11 13:17
Оценка:
Мне нужно в функцию, которая имеет дело с файлами передать int

Я делаю так


int handle = _fileno(f);


А как наоборот получить FILE * по int хэндлу ?

Он мне нужен для fread и fwrite.
Re: Как получить FILE* по int хэндлу.?
От: watch-maker  
Дата: 28.06.11 13:20
Оценка:
А>А как наоборот получить FILE * по int хэндлу ?
fdopen(...)
Re: Как получить FILE* по int хэндлу.?
От: sand7e Россия  
Дата: 28.06.11 16:25
Оценка:
#include <stdio.h>

FILE *fopen(const char *path, const char *mode);

FILE *fdopen(int fd, const char *mode);
Re: Как получить FILE* по int хэндлу.?
От: ononim  
Дата: 28.06.11 18:50
Оценка:
А>int handle = _fileno(f);
А>А как наоборот получить FILE * по int хэндлу ?
А>Он мне нужен для fread и fwrite.

А зачем? Вы в курсе, что
1) Хэндл, который возвращает _fileno валиден до тех пор пока не будет вызван fclose для f. Так что код типа
FILE *f1 = fopen(...)
int h =  _fileno(f1);
FILE *f2 = fdopen(h,...)
fclose(f1)
fprintf(f2)... //БАМЦ, хэндл используемый f2 уже невалиден ибо fclose(f1) его закрыл.
fclose(f2)...//БАМЦ, ибо см выше.

2) По умолчанию вывод в FILE * буферизуется. Буфер ассоциируется с конкретной FILE структурой. Если вы ассоциируете две FILE структуры с одним и тем же низкоуровевым хэндлом (с помощью дважды предложенных fdopen(_fileno(f)) вы по сути получите две различных буфера — каждый у своей FILE *, так что две последовательные записи в разные структуры FILE ассоциированные с одним и тем же файловым дескриптором могут оказаться записаны в совершенно не том порядке, в каком вы вызывали функции записи (к примеру fprintf)

Так что лучше расскажите что вам на самом деле надо.
Как много веселых ребят, и все делают велосипед...
Re[2]: Как получить FILE* по int хэндлу.?
От: dilmah США  
Дата: 28.06.11 20:10
Оценка:
O>А зачем? Вы в курсе, что

ну есть вполне легальные случаи использования фдопен.
Скажем, изначально приходит дескриптор (например создается вызовом pipe), а дальше по каким-то соображениям (скажем, апи такое) хочется все операции производить с FILE*
Re[3]: Как получить FILE* по int хэндлу.?
От: ononim  
Дата: 28.06.11 20:21
Оценка:
D>ну есть вполне легальные случаи использования фдопен.
D>Скажем, изначально приходит дескриптор (например создается вызовом pipe), а дальше по каким-то соображениям (скажем, апи такое) хочется все операции производить с FILE*

Верно, но ОН делает так:
int handle = _fileno(f);
Как много веселых ребят, и все делают велосипед...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.