fdopen.c

来自「Algorithms for Image Processing and Comp」· C语言 代码 · 共 85 行

C
85
字号
/* This is file FDOPEN.C */
/* This file may have been modified by DJ Delorie (Jan 1991).  If so,
** these modifications are Coyright (C) 1993 DJ Delorie, 24 Kirsten Ave,
** Rochester NH, 03867-2954, USA.
*/

/*
 * Copyright (c) 1980 Regents of the University of California.
 * All rights reserved.  The Berkeley software License Agreement
 * specifies the terms and conditions for redistribution.
 */

#if defined(LIBC_SCCS) && !defined(lint)
static char sccsid[] = "@(#)fdopen.c	5.2 (Berkeley) 3/9/86";
#endif LIBC_SCCS and not lint

/*
 * Unix routine to do an "fopen" on file descriptor
 * The mode has to be repeated because you can't query its
 * status
 */

#include <sys/types.h>
#include <sys/file.h>
#include <stdio.h>
#include <io.h>

FILE *
fdopen(fd, mode)
     int fd;
     const char *mode;
{
	extern FILE *_findiop();
	static int nofile = -1;
	register FILE *iop;
	int new_mode = _fmode;

	if (nofile < 0)
		nofile = getdtablesize();

	if (fd < 0 || fd >= nofile)
		return (NULL);

	iop = _findiop();
	if (iop == NULL)
		return (NULL);

	iop->_cnt = 0;
	iop->_file = fd;
	iop->_bufsiz = 0;
	iop->_base = iop->_ptr = NULL;

	switch (*mode) {
	case 'r':
		iop->_flag = _IOREAD;
		break;
	case 'a':
		lseek(fd, (off_t)0, L_XTND);
		/* fall into ... */
	case 'w':
		iop->_flag = _IOWRT;
		break;
	default:
		return (NULL);
	}

	if (mode[1] == '+')
	{
		iop->_flag = _IORW;
		mode++;
	}
	if (mode[1] == 't')
	{
		iop->_flag |= _IOTEXT;
		new_mode = O_TEXT;
	}
	if (mode[1] == 'b')
	{
		new_mode = O_BINARY;
	}
	setmode(fd, new_mode);

	return (iop);
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?