📄 _file.h
字号:
long _C_seek (long __offset, int __origin) {
int __rc = fseek (_C_fptr, __offset, __origin);
if (__rc != 0)
return -1;
return ftell (_C_fptr);
}
int _C_flush () {
return _C_is_open () ? fflush(_C_fptr) : EOF;
}
#endif //_RWSTD_NO_NATIVE_IO
private:
FILE *_C_fptr; // file pointer - used if _RWSTD_NO_NATIVE_IO is undef'd
int _C_fdsc; // file descriptor - used otherwise (default)
};
inline int __rw_file_t::_C_get_mode (int __fd)
{
// FIXME -- need to have equivalent of fcntl() on win32.
#if defined (_RWSTD_NO_NATIVE_IO)
return __fd == STDIN_FILENO
? _RWSTD_IOS_IN
: __fd == STDOUT_FILENO || __fd == STDERR_FILENO
? _RWSTD_IOS_OUT : _RWSTD_IOS_OUT | _RWSTD_IOS_IN;
#else
int __m = fcntl (__fd, F_GETFL);
if (__m == -1)
return _RWSTD_INVALID_OPENMODE;
int __mode = __m & O_APPEND ? _RWSTD_IOS_APP : 0;
switch (__m & O_ACCMODE) {
case O_RDONLY: __mode |= _RWSTD_IOS_IN; break;
case O_WRONLY: __mode |= _RWSTD_IOS_OUT; break;
case O_RDWR: __mode |= _RWSTD_IOS_IN | _RWSTD_IOS_OUT; break;
}
return __mode;
#endif
}
inline int __rw_file_t::_C_get_mode (FILE *__fp)
{
return _C_get_mode (_C_fileno (__fp));
}
#ifndef _RWSTD_NO_NATIVE_IO
#ifdef _INLINE_WITH_STATICS
_INLINE_WITH_STATICS int
__rw_file_t::_C_get_mode_arg (int __index) const
{
#if !(defined (__osf__) && defined (__GNUG__) \
&& __GNUG__ == 2 && __GNUG_MINOR__ < 96)
// static not used to prevent a g++ 2.95.2 warning on Tru64
// sorry: semantics of inline function static data are wrong
// (you'll wind up with multiple copies)
static
#endif
const int __modetbl [] = {
-1, // no flags error
O_WRONLY | O_APPEND | O_CREAT, // app
-1 | _BINARY, // binary
O_WRONLY | _BINARY | O_APPEND | O_CREAT, // binary|app
O_RDONLY, // in
O_RDONLY | O_APPEND, // in|app
O_RDONLY | _BINARY, // in|binary
O_RDONLY | _BINARY | O_APPEND | O_CREAT, // in|binary|app
O_TRUNC | O_WRONLY | O_CREAT, // out
O_WRONLY | O_APPEND | O_CREAT, // out|app
O_TRUNC | O_WRONLY | O_CREAT | _BINARY, // out|binary
O_WRONLY | _BINARY | O_APPEND | O_CREAT, // out|binary|app
O_RDWR, // out|in
O_RDWR | O_APPEND | O_CREAT, // out|in|app
O_RDWR | _BINARY, // out|in|binary
O_RDWR | _BINARY | O_APPEND | O_CREAT, // out|in|binary|app
O_TRUNC, // trunc
O_TRUNC | O_APPEND, // trunc|app
O_TRUNC | _BINARY, // trunc|binary
O_TRUNC | O_APPEND | _BINARY, // trunc|binary|app
O_TRUNC | O_RDONLY, // trunc|in
O_TRUNC | O_RDONLY | O_APPEND, // trunc|in|app
O_TRUNC | O_RDONLY | _BINARY, // trunc|in|binary
O_TRUNC | O_RDONLY | _BINARY | O_APPEND, // trunc|in|binary|app
O_TRUNC | O_WRONLY | O_CREAT, // trunc|out
O_TRUNC | O_WRONLY | O_APPEND | O_CREAT, // trunc|out|app
O_TRUNC | O_WRONLY | _BINARY | O_CREAT, // trunc|out|binary
O_TRUNC | O_WRONLY | _BINARY | O_APPEND| O_CREAT,// trunc|out|binary|app
O_TRUNC | O_RDWR | O_CREAT, // trunc|out|in
O_TRUNC | O_RDWR | O_APPEND | O_CREAT, // trunc|out|in|app
O_TRUNC | O_RDWR | O_CREAT | _BINARY, // trunc|out|in|binary
O_TRUNC | O_RDWR | _BINARY | O_APPEND | O_CREAT // trunc|out|in|binary|app
};
if ( 0 > __index
|| int (sizeof __modetbl / sizeof *__modetbl) <= __index)
return _RWSTD_INVALID_OPENMODE;
return __modetbl[__index];
}
#endif // _INLINE_WITH_STATICS
inline __rw_file_t&
__rw_file_t::_C_open (const char *__name, int __mode, long __prot)
{
int __m = _C_get_mode_arg ( __mode
& ~(_RWSTD_IOS_NOCREATE | _RWSTD_IOS_NOREPLACE));
if (__m == _RWSTD_INVALID_OPENMODE){
_C_fdsc = _RWSTD_INVALID_FILE_DESC;
return *this;
}
if (__mode & _RWSTD_IOS_OUT) {
if (__mode & _RWSTD_IOS_NOCREATE)
__m &= ~O_CREAT;
if (__mode & _RWSTD_IOS_NOREPLACE)
__m |= O_EXCL;
}
_C_fdsc = open (__name, __m, __prot);
return *this;
}
inline int __rw_file_t::_C_get_mode () const
{
return _C_get_mode (_C_fdsc);
}
#else // if defined (_RWSTD_NO_NATIVE_IO)
inline const char* __rw_file_t::_C_get_mode_arg (int __index) const
{
#if !(defined (__osf__) && defined (__GNUG__) \
&& __GNUG__ == 2 && __GNUG_MINOR__ < 96)
// static not used to prevent a g++ 2.95.2 warning on Tru64
// sorry: semantics of inline function static data are wrong
// (you'll wind up with multiple copies)
static
#endif
const char __modetbl [][4] = {
"", // no flags error 0
"a", // app 1
"", // binary 2
"ab", // binary|app 3
"r", // in 4
"a", // in|app 5
"rb", // in|binary 6
"ab", // in|binary|app 7
"w", // out 8
"a", // out|app 9
"wb", // out|binary 10
"ab", // out|binary|app 11
"r+", // out|in 12
"a+", // out|in|app 13
"r+b", // out|in|binary 14
"a+b", // out|in|binary|app 15
"w", // trunc 16
"w", // trunc|app 17
"wb", // trunc|binary 18
"wb", // trunc|binary|app 19
"", // trunc|in 20
"", // trunc|in|app 21
"", // trunc|in|binary 22
"", // trunc|in|binary|app 23
"w", // trunc|out 24
"w", // trunc|out|app 25
"wb", // trunc|out|binary 26
"wb", // trunc|out|binary|app 27
"w+", // trunc|out|in 28
"w+", // trunc|out|in|app 29
"w+b", // trunc|out|in|binary 30
"w+b" // trunc|out|in|binary|app 31
};
if ( 0 > __index
|| int (sizeof __modetbl / sizeof *__modetbl) <= __index)
return 0;
return __modetbl[__index];
}
#ifndef _RWSTD_NO_FILENO
inline __rw_file_t::__rw_file_t (int __fd)
{
const char *__mode = _C_get_mode_arg (_C_get_mode (__fd));
_C_fptr = __mode && __fd > -1 ? fdopen (__fd, __mode) : 0;
}
#else
inline __rw_file_t::__rw_file_t (int __fd)
{
_C_fptr = (__fd == STDIN_FILENO) ? &std::__stdin :
((__fd == STDOUT_FILENO) ? &std::__stdout :
((__fd == STDERR_FILENO) ? &std::__stderr : 0));
if (_C_fptr == 0)
_RW::__rw_throw (_RWSTD_ERROR_RUNTIME_ERROR, "possix _C_get_mode not supported");
}
#endif //_RWSTD_NO_FILENO
inline __rw_file_t& __rw_file_t::_C_open (const char *__name, int __mode, long)
{
const char *__m = _C_get_mode_arg (__mode);
if (!__m) {
_C_fptr = 0;
return *this;
}
_C_fptr = fopen (__name, __m);
#ifndef __ARM_DONT_WANT_IONBF
if (_C_is_open ( ))
setvbuf (_C_fptr, 0, _IONBF, 0);
#endif
return *this;
}
inline int __rw_file_t::_C_get_mode () const
{
return _C_get_mode (_C_fptr);
}
#endif // _RWSTD_NO_NATIVE_IO
_RWSTD_NAMESPACE_END // __rw
#endif // _RWSTD_FILE_H_INCLUDED
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -