HANDLES에 fdopen과 동등한 윈도우가 있습니까?
유닉스에서는 소켓, 파이프 또는 상위 프로세스에서 상속된 파일 설명자가 있는 경우 버퍼 I/O를 열 수 있습니다.FILE*그것을 타고 흐르다
Windows에 다음과 같은 기능이 있습니까?HANDLEs? 만약 당신이.HANDLE부모 프로세스(stdin, stdout 또는 stderr와 다름) 또는 파이프에서 상속되었습니다.CreatePipe, 버퍼링이 가능한가요?FILE*거기서 스트림?MSDN은 문서화를 하지만 그것은 반환되는 정수 파일 기술자와 함께 작동합니다._open, 일반적이지 않은HANDLEs.
불행하게도,HANDLEs는 완전히 다른 짐승입니다.FILE*s 및 파일 설명자.CRT는 궁극적으로 다음과 같은 측면에서 파일을 처리합니다.HANDLE그것들을 연관짓습니다.HANDLE파일 설명자에 s를 저장합니다.파일 설명자는 다음과 같이 구조 포인터를 백업합니다.FILE*.
다행히 이 MSDN 페이지에는 "파일 구조, 파일 설명자 및 Win32 파일 핸들 사이에서 파일의 표현을 변경할 수 있는 방법"을 설명하는 섹션이 있습니다.
_fdopen,_wfdopen: 스트림을 이전에 로우 레벨 I/O용으로 열린 파일과 연결하고 포인터를 열린 스트림으로 반환합니다._fileno: 스트림과 연결된 파일 설명자를 가져옵니다._get_osfhandle: 기존 C 런타임 파일 설명자와 연결된 운영 체제 파일 핸들 반환_open_osfhandle: C 런타임 파일 설명자를 기존 운영 체제 파일 핸들과 연결합니다.
당신이 필요로 하는 것은 그 다음에 필요한 것으로 보입니다.FILE*로부터HANDLE.
여기에 관련된 예가 있습니다.HANDLE에서 얻은 sCreateFile(). 테스트를 해보니 "test.txt" 파일의 처음 255자가 표시되고 파일 끝에 " --- 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);
}
}
}
이것은 파이프에도 효과가 있을 것입니다.
다음은 CreateFile 대신 보다 우아한 방법입니다. fopen()에 "N"을 지정합니다.오픈하기 위한 마이크로소프트 고유의 확장이지만, 어쨌든 이 코드는 플랫폼 고유의 것이기 때문에 괜찮습니다."N"과 함께 호출하면 fopen은 내부적으로 _open을 호출할 때 _O_NOINHERIT 플래그를 추가합니다.
이를 바탕으로:Windows C Run-Time _close(fd) 파일을 닫지 않음
언급URL : https://stackoverflow.com/questions/7369445/is-there-a-windows-equivalent-to-fdopen-for-handles
'programing' 카테고리의 다른 글
| 공개 동의어를 올바르게 만드는 방법 (0) | 2023.10.01 |
|---|---|
| PHP의 Laravel에서 laravel.log를 지우려면 어떻게 해야 합니까? (0) | 2023.10.01 |
| 조건부 실행 (&& 및 ||) (0) | 2023.10.01 |
| Pyspark: 여러 배열 열을 행으로 나눕니다. (0) | 2023.10.01 |
| 폭 100% 테이블 넘침 디브용기 (0) | 2023.09.26 |