Ответ 1
К сожалению, HANDLE
- совершенно разные звери из FILE*
и файловые дескрипторы. CRT в конечном итоге обрабатывает файлы в терминах HANDLE
и связывает эти HANDLE
с файловым дескриптором. Эти дескрипторы файлов по очереди возвращают указатель структуры FILE*
.
К счастью, есть раздел на этой странице MSDN, который описывает функции, которые "обеспечивают способ изменения представления файла между a FILE, дескриптор файла и дескриптор файла Win32":
_fdopen
,_wfdopen
: связывает поток с файлом, который был ранее открытая для ввода-вывода низкого уровня и возвращает указатель на открытый поток._fileno
: получает дескриптор файла, связанный с потоком._get_osfhandle
: Обратить дескриптор файла операционной системы с существующим дескриптором файла времени выполнения_open_osfhandle
: дескриптор файла среды выполнения Associates C с существующий дескриптор файловой системы операционной системы.
Похоже, что вам нужно _open_osfhandle
, за которым следует _fdopen
, чтобы получить FILE*
от HANDLE
.
Здесь приведен пример с HANDLE
, полученный из CreateFile()
. Когда я тестировал его, он показывает первые 255 символов файла "test.txt" и добавляет "--- Hello World! ---" в конец файла:
#include <windows.h>
#include <io.h>
#include <fcntl.h>
#include <cstdio>
int main()
{
HANDLE h = CreateFile("test.txt", GENERIC_READ | GENERIC_WRITE, 0, 0,
OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
if(h != INVALID_HANDLE_VALUE)
{
int fd = _open_osfhandle((intptr_t)h, _O_APPEND | _O_RDONLY);
if(fd != -1)
{
FILE* f = _fdopen(fd, "a+");
if(f != 0)
{
char rbuffer[256];
memset(rbuffer, 0, 256);
fread(rbuffer, 1, 255, f);
printf("read: %s\n", rbuffer);
fseek(f, 0, SEEK_CUR); // Switch from read to write
const char* wbuffer = " --- Hello World! --- \n";
fwrite(wbuffer, 1, strlen(wbuffer), f);
fclose(f); // Also calls _close()
}
else
{
_close(fd); // Also calls CloseHandle()
}
}
else
{
CloseHandle(h);
}
}
}
Это также должно работать и на трубах.