Я думаю, что в настоящее время я не очень хорошо понимаю механизмы флагов io stream. Чтобы попытаться понять это, я задам вопросы на двух конкретных примерах.
Первый касается открытого режима.
Например, для std :: ofstream мы имеем:
void open ( const char * filename, ios_base::openmode mode = ios_base::out );
app (append) Set the stream's position indicator to the end of the stream before each output operation.
ate (at end) Set the stream's position indicator to the end of the stream on opening.
binary (binary) Consider stream as binary rather than text.
in (input) Allow input operations on the stream.
out (output) Allow output operations on the stream.
trunc (truncate) Any current content is discarded, assuming a length of zero on opening.
У меня есть следующие вопросы:
std::ofstream stream;
// Question 1 : Here I don't specify std::ios::out, so why does it work ? :
stream.open("file.txt", std::ios::binary);
// Question 2 : Here I activate trunc, but how can I deactivate it ?
stream.open("file.txt", std::ios:binary | std::ios::trunc);
// Question 3 : What would be the result of that ?
stream.open("file.txt", std::ios::in);
Второй касается государственных флагов. Рассмотрим следующий пример:
std::ofstream stream;
std::cout<<stream.good()<<stream.bad()<<stream.fail()<<stream.eof()<<std::endl;
stream<<'x';
std::cout<<stream.good()<<stream.bad()<<stream.fail()<<stream.eof()<<std::endl;
/* SOMETHING */
Поскольку ни один файл не открыт, результатом является:
1000 // <- Good bit is true
0110 // <- Fail and bad bit are true
Вопрос 4: какой кусок кода я могу написать вместо /* SOMETHING */
, чтобы сбросить badbit
в false
и установить eofbit
в true
(эта операция здесь не имеет смысла, но она просто для понимания поведения этих битов).
С целью:
rdbuf () -> open (имя, режим | std :: ios_base :: out);
Другими словами, `std :: ofstream` всегда добавляет бит` out` при открытии.
Как вы могли заметить, имена не всегда интуитивно понятны: clear
установить
немного, и логика далеко не ортогональна по отношению к открытому
флаги.
Других решений пока нет …