39 if(
const auto fp = std::fopen(path,
"rb"))
53 switch(
unsigned((mode &= ~ios_base::ate) & ~ios_base::binary))
56 case ios_base::out | ios_base::trunc:
57 return mode & ios_base::binary ?
"wb" :
"w";
58 case ios_base::out | ios_base::app:
60 return mode & ios_base::binary ?
"ab" :
"a";
62 return mode & ios_base::binary ?
"rb" :
"r";
63 case ios_base::in | ios_base::out:
64 return mode & ios_base::binary ?
"r+b" :
"r+";
65 case ios_base::in | ios_base::out | ios_base::trunc:
66 return mode & ios_base::binary ?
"w+b" :
"w+";
67 case ios_base::in | ios_base::out | ios_base::app:
68 case ios_base::in | ios_base::app:
69 return mode & ios_base::binary ?
"a+b" :
"a+";
75 std::ios_base::openmode
82 ios_base::openmode mode;
87 mode = ios_base::out | ios_base::trunc;
100 auto l(char_traits<char>::length(str));
102 if(str[l - 1] ==
'x')
104 if(mode & ios_base::out)
105 mode &= ~ios_base::out;
111 bool b(str[1] ==
'b'), p(str[1] ==
'+');
120 yunseq(b ^= str[2] ==
'b', p ^= str[2] ==
'+');
127 mode |= *str ==
'r' ? ios::out : ios::in;
134 return ios_base::openmode();
143 const auto val(std::fgetc(
stream));